2011-08-02 13 views
66

どうすればいいですかtypedeftemplate class?ような何か:テンプレートクラスをtypedefするには?

typedef std::vector myVector; // <--- compiler error 

私は2つの方法を知っている:

(1) #define myVector std::vector // not so good 
(2) template<typename T> 
    struct myVector { typedef std::vector<T> type; }; // verbose 

は、我々はC++ 0xの中で、より良いものを持っていますか?

+0

なぜこれが欲しいですか?ユースケースは何ですか? –

+2

私はいくつかの 'テンプレートクラス'を含んでいるところで何かを実装しています。最初に、私は標準のクラスでそれを実装します、私は自分のカスタムクラスに移動したいです。ですから、そのスイッチは 'typedef'を変更するだけの簡単なものでなければなりません。 – iammilind

+0

私はDavidに同意する必要があります。なぜこれをエイリアスしたいのですか?間接参照は、読み取り不可能で保守不能なコードの主な原因です。しかし、あなたは正当な理由、 "抽象"を与えました。 stlの問題はAPIです。特定の最適化を妨げます。同じAPIを使い、あなたがもっとうまくいくと思っているのは悪いことです。あなた自身の成長可能な配列を書くのに一日かかることはありません。ちょうどそれをして、それで済ませてください。またはSTLを使用して、あなたの人生に乗ってください。 – Dan

答えて

108

はい。これは「alias template」と呼ばれ、C++ 11の新機能です。

template<typename T> 
using MyVector = std::vector<T, MyCustomAllocator<T>>; 

使い方は、あなたが期待どおりに、次のようになります。

MyVector<int> x; // same as: std::vector<int, MyCustomAllocator<int>> 

はGCC 4.7以降、それを支えてきたとクランは3.0以来、それを持っています。

+0

それは素晴らしいですが、私はgcc4.6または4.5(http://www.ideone.com/I8kbA)で確認することができません。 MSVCでコンパイルしていますか? – iammilind

+0

C++ 0xが最初に受け入れられるのを待たなければなりません。その後、コンパイラ作成者が実際に標準を実装するのを待たなければなりません。 –

+1

"キャッチは誰もまだサポートしていないということです。"数ヶ月からclang(svn trunk)に入っています。 –

14

C++ 03では、(公開または非公開で)クラスから継承することができます。

template <typename T> 
class MyVector : public std::vector<T, MyCustomAllocator<T> > {}; 

あなたは(具体的には、コピーコンストラクタ、代入演算子)、もう少し作業を行う必要があるが、それはかなりなんとかです。

+2

@ iammilind:ダウンボントから保護するのではなく、アップヴォートを使うだけで、より多くの可能性が生まれます(*この質問はどうやってアップアップされますか?*推論の種類)。私はSTLコンテナから継承することに対して公然としているものの1つですが、この場合には多くの選択肢はありません。最高の選択肢は、なぜあなたが最初にこれをやりたいのか考え直すことですね... –

+0

@David Rodriguezはなぜあなたが望むのかについて同意しました。しかし、別のアロケータに基づいてベクトルを頻繁に使用する場合、テンプレートのtypedefは非常に歓迎されていました。プライベートな継承(つまり、実装された条件)は、私には問題ありませんが、それを継承する理由がある場合に限ります。通常はそうではありません。 – dascandy

+0

おそらくstd :: vector のためではありませんが、一般的にどのように役立つかがわかります。 LongName (またはネストされたテンプレートの長い連鎖)のようなタイプがあるとします。ショートカット名を付けると便利です。 1つまたは2つの異なるTにこの型を使用すると、型定義できます。しかし、多くの型Tがある場合は、それらをすべてtypedefすれば、名前を直接使うことができますが、その名前を使用することは辛いほどです。 – bartgol

関連する問題