5

この質問では、OP は C++ では不可能なテンプレート typedef の解決策を求めました。OPも解決策を提示しましたが、気に入らなかった:

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::type 私の質問は、OPのソリューションよりもこのソリューションがどのような利点をもたらすかです(これらのクラスがベースポインターによって使用されることを意図したものではない、またはnewそのようなものであると仮定すると)? 空のクラスは、リリース時にオーバーヘッドを持ちません (またはそうしますか?)。私が見ることができる唯一の欠点は、デバッグ ビルドでは、デバッグ時に基本クラスを展開する必要があることです。

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

4

3 に答える 3

7

The point of typedef is to define a type alias. A subclass is not a type alias - it is a new type.

For example, imagine some library function

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

Now with helper type

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

is legal.
With inheritance

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

is not.

于 2012-05-16T15:58:38.660 に答える
7

これは、コンストラクターが継承されていないためです (そして、c++ 11 ではデフォルトではありません)。したがって、実装で基本クラスのコンストラクターを呼び出すだけであっても、デフォルト以外のすべての構成をコピーする必要があります。

于 2012-05-16T15:56:04.270 に答える
3

誰もが構文を好みますが(主観的かもしれません)、主な違いは、inhetiranceによって、vectorは実際には行列に減衰する別の型ですが、typedefを含むヘルパーを使用すると、vectorは行列のエイリアスになります(少なくとも部分的な特殊化が適用されます)。

違いは、(継承されない)コンストラクターを再定義するためのベクトル、またはテンプレートの特殊化に関して定義された操作の場合のいくつかの潜在的な落とし穴を必要とします(typedefを使用すると、それらは「differnet」とは見なされません)

于 2012-05-16T16:04:01.370 に答える