5

最近手にしたコードについて質問があります。C++ テンプレート パラダイムで、次の継承を行うことが正しいか、または有用かどうかを知りたいだけです (例として 3 つのクラスのみ)。


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
{
   ...
}

私の質問は、具体的には 3 番目の例の継承に関するものです。正確ではなく「一般的」にすることは有用ですか?より一般的なコードによって理解しやすいコードを妥協するのは良い選択ですか?

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

4

1 に答える 1

2

あなたがしているのはミックスインクラスです(特に、あなたのクラスAlgorithmが1つです)。

参考として、たとえばhttp://en.wikipedia.org/wiki/Mixinまたはhttp://en.wikipedia.org/wiki/Composite_patternを参照できます。

A実際、「サブクラス(つまり)によって継承または再利用される特定の機能(によって指定される)」を指定していますAlgorithm。(最初の記事から引用)

言い換えれば、あなたはあなた自身(またはあなたのユーザー)がAlgorithm何らかの形で「後で」行動を追加または変更できるようにしています。あなたの本当の利益は、動的バインディングのようなメカニズム(仮想関数のオーバーライドなど)ではなく、コンパイラーだけに依存するような柔軟性を実現することです。実際、最終的なクラスAlgorithm<A>はコンパイル時に構築され、明示的に 記述して取得したクラスと同じくらい効率的である可能性があります(つまり、手動で記述した場合Algorithm<A>にポリシーを明示的に含めます)。AAlgorithm

編集

また、ポリシーベースの設計に関するこのウィキペディアのページ( http://en.wikipedia.org/wiki/Policy-based_design )を参照することをお勧めします。

そこでは、@ full.stack.exが賢明にアドバイスしているように、ポリシー名(your A)が明確な名前で明確な形式で表示されます。

于 2012-10-16T14:17:01.277 に答える