2

これは、テンプレートの特殊化または条件式に続く考え方で発生しましたか? .

私は私のプロジェクトでテンプレートの特殊化を使用しており、Stroustrup からこの例に出くわしました: Matrix.h、彼は MatrixBase テンプレート クラスを宣言します。

template<class T> class Matrix_base

共通要素および Matrix テンプレート クラス用

template<class T = double, int D = 1> class Matrix

スペシャライゼーションの「小道具」(それが何であれ)として。彼は、特殊化のみをインスタンス化できるように、コンストラクターをプライベートとして宣言します。これらは次のように宣言されています。

template<class T> class Matrix<T,1> : public Matrix_base<T> {...};
template<class T> class Matrix<T,2> : public Matrix_base<T> {...};
template<class T> class Matrix<T,3> : public Matrix_base<T> {...};

私の質問は次のとおりです。この場合、専門化の利点は何ですか? 明らかに、3 つの特殊化に共通するコードはありません。そのため、一般的なテンプレートを切り取って次のように宣言してはいかがでしょうか。

template<class T> class Matrix_1<T> : public Matrix_base<T> {...};
template<class T> class Matrix_2<T> : public Matrix_base<T> {...};
template<class T> class Matrix_3<T> : public Matrix_base<T> {...};

?

4

2 に答える 2

5

2 番目のテンプレート パラメーターを使用することで、特殊化だけでなく、特殊化されていない一般的な実装も可能になるためです。そう

Matrix<float, 1000> m;

を定義する必要があるのに対し、Matrix_1000<T>. 編集:最初のポイントは一般的に適用されますが、一般的なケースにプライベートコンストラクターがあるこの特定のケースには適用されません。

さらに、次のようなことができます

Matrix<double, SOME_CONSTANT> m;

あなたの_Nソリューションではできません。

于 2012-07-04T12:13:06.837 に答える
2

基本的に答えは、汎用コードでテンプレートを使用できるということです。コンパイル時の定数を使用してプログラムの動作を変更したりMatrix、型の名前が異なる場合に処理できなかったクラスの異なるバージョンを処理する汎用コードを記述したりできます。

template <typename T, int D>
void print( std::ostream& o, Matrix<T,D> const & m ) { ...

つまり、さまざまなタイプを明示的に作成する必要がある場合でも、特殊化メカニズムにより、1 つのタイプの単なるバリアントであるかのように、さまざまなタイプを管理するために一般的に使用できる単一の名前を提供できます。

于 2012-07-04T13:28:02.030 に答える