2012-10-16 13 views
5

最近私が手に取ったコードに関する質問があります。テンプレートからの継承C++


template< class I, class P, class D, unsigned int ID = 0 > 
class PathFilter : public Filter< I, P, 1 > 
{ 
... 
} 

template< class I, class A, unsigned int N = 1 > 
class Filter : public Algorithm< I, A > 
{ 
... 
} 

template< class I, class A > 
class Algorithm : public A //This line 
{ 
    ... 
} 
:C++テンプレートのパラダイムでは、次の継承(例として、わずか3クラス)を行うために正しいか有益である場合、私はちょうど知りたいです

私の質問は、特に第3の例の継承についてです。それを「ジェネリック」と正確ではないようにすることは有用ですか?もっと一般的なコードで理解できるコードを妥協するのは良い選択ですか?

私はC++テンプレートの専門家ではなく、テンプレートを使用してこのコードを理解することが難しいため、最初に質問します(通常、テンプレートの名前はその内容について何も言いません)。何かアドバイス?

答えて

2

お手数ですが mixinのクラス(特に、クラスAlgorithmがこれに該当します)

たとえば、http://en.wikipedia.org/wiki/Mixinまたはhttp://en.wikipedia.org/wiki/Composite_patternなどを参照してください。

実際には、「特定の機能(Aで指定)を継承するか、サブクラス(つまりAlgorithm)で再利用する」と指定しています。

言い換えれば、自分自身(またはあなたのユーザー)が何らかの形で「後で」Algorithmに動作を追加または変更できるようにしています。あなたの真の利得は、コンパイラだけに依存し、いくつかの動的バインディングのようなメカニズム(例えば、仮想関数のオーバーライド)ではなく、そのような柔軟性を実現することです。最終的なクラスAlgorithm<A>は、実際には、コンパイル時に構築されており、それはおそらくあなたが(すなわち、明示的に手によってを書いAlgorithmにおける政策A含む)を明示的Algorithm<A>を書い得られたであろうクラスほど効率的です。

EDITは:

私は、ポリシーベースの設計については、このWikipediaのページ(http://en.wikipedia.org/wiki/Policy-based_design)の外観を与えるためにお勧めします。

ポリシー名(お客様のA)は、@ full.stack.exによって賢明にアドバイスされたように、明確な名前で明確な形式で表示されます。

+1

だから、もしそれがあなたが望むなら、大丈夫です。読みやすさに関しては、テンプレートパラメータに奇妙に名前を付けるという伝統があります。私、P、Aなどですが、あなたはそうする必要はありません:)。彼らにより良い名前をつけてください。そして、彼らは自己記述的になるかもしれません。 –

+1

あなたの答えをありがとうが、私はまだ質問があります。私は、「より高い」クラスでいくつかの機能の一般的かつ抽象的な定義を使用することを理解しています。しかし、テンプレートの主な目的はパラメータ型を一般化することではありませんか?私が最後に言っていることは、このクラスにほとんどすべてを渡して、より低い階層の機能を保つことができるということです。最後に、下位の関数を継承できる(おそらく1つの)オブジェクトの非常に制限されたセットを持っていますが、間違っていますか?その一般性を定義することは非実用的な方法ではありませんか? –

関連する問題