C ++テンプレートtypedef


369

クラスがあります

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

サイズNおよび1のa と同等の(列ベクトル)typedefを作成するa を作成します。そのようなもの:VectorMatrix

typedef Matrix<N,1> Vector<N>;

コンパイルエラーが発生します。以下は似たようなものを作成しますが、正確には私が望んでいるものではありません。

template <size_t N>
class Vector: public Matrix<N,1>
{ };

解決策またはそれほど高価ではない回避策/それに対するベストプラクティスはありますか?

回答:


550

C ++ 11 は、の一般化であるエイリアス宣言を追加しtypedef、テンプレートを許可します。

template <size_t N>
using Vector = Matrix<N, 1>;

タイプVector<3>はと同等Matrix<3, 1>です。


C ++ 03では、最も近い近似は次のとおりでした。

template <size_t N>
struct Vector
{
    typedef Matrix<N, 1> type;
};

ここでは、タイプVector<3>::typeはと同等Matrix<3, 1>です。


45
おお、C ++ 0xのこの部分を見たことがなかったので、テンプレート化されたtypedefについてしばらく考えていました...最終草案をもっと完全に読んだほうがいいと思います。
Matthieu M.10年

2
継承するコンストラクターは、OPの元のソリューションをより実行可能なソリューションにしますか?
StackedCrooked 2012

2
@StackedCrooked:彼の目標に依存します。構成が行われるときは継承を避けます(そうです、そうすれば、コンストラクタを継承するとこれらの両方が簡単になります)。typedefが行われるときは構成も避けます。
GManNickG 2012

1
私が間違っていなければ、usingは特殊化をサポートしていないため、2番目のオプションは多くの場合に役立ちます。
Utkarsh Bhardwaj
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.