2012-05-16 7 views
5

this questionで、OPはC++では不可能なテンプレートtypedefに対する解決策を求めました。 OPはまた、溶液に自分自身を提示し、それを好きではなかった:テンプレートtypedefがC++(C++ 11ではなく)で問題になっています

template<size_t N, size_t M> 
class Matrix { 
    // .... 
}; 

// Problem - will not compile 
typedef Matrix<N,1> Vector<N>; 

// Solution 
template <int N> 
class Vector: public Matrix<N,1> 
{ }; 

私の質問、Helper::typesolutionは、これらのクラスはベースポインタで使用されることを意図されることはありませんと仮定すると(OPのソリューション上で私たちをどのような優位性を与えるんさまたはnew 'd)?空のクラスでは、リリース時にオーバーヘッドが発生しません(またはそれはありますか?)。私が見ることができる唯一の欠点は、デバッグビルドでは、デバッグ時にベースクラスを拡張する必要があることです。

EDIT:選択された回答に加えて、継承されたバージョンではコンストラクタを定義する必要があることを示唆した@ Daniの回答を参照してください。これは追加の不都合です。

+0

(のtypedefで、彼らは「differnetの」として見れません)(継承されません)コンストラクタ、またはテンプレートの特殊化の項に定義された操作の場合は、いくつかの潜在的な落とし穴を再定義するベクトルが必要ですそれ以外の場合は、実際には 'Helper :: type'が正しいタイプです。私は真剣にこのようなことを掘り下げてからしばらくしていますが、IIRCにはタイプ控除などの微妙な問題があります。 – Hurkyl

答えて

7

typedefのポイントは、タイプエイリアスを定義することです。サブクラスは型エイリアスではなく、新しい型です。例えば

Vector<3>::type * var = createMatrix<3, 1>(); 

が合法であるヘルパータイプで今すぐ

template<size_t N, size_t M> 
Matrix<N, M> * createMatrix(); 

いくつかのライブラリ関数を想像してみてください。相続

Vector<3> * var = createMatrix<3, 1>(); 


ではありません。

+0

確かに、とにかく(テンプレート引数が異なるたびに)新しいタイプを作成していますので、結局は違いがありますか? – Samaursa

+0

@Samaursa私の編集を参照してください。 –

7

これはコンストラクタが継承されていないためです(デフォルトではC++ 11では使用できません)。 したがって、実装で基本クラスのコンストラクタを単に呼び出しても、すべての非デフォルトの構造体をコピーする必要があります。

+0

aha!これは何らかの理由で私の心を失った!完璧、ありがとう。 – Samaursa

3

主観的に違いがありますが、主な相違点は、パターンとは別に、マトリックスが崩壊するタイプで、typedefを含むヘルパーを使用しているのに対し、ベクターはマトリックスのエイリアスです少なくとも部分的な専門化が適用されるものについては)。

違いは、場合

関連する問題