2009-09-24 9 views
26

利用可能なTR1ライブラリがあるかどうかに応じて、unordered_mapまたはstd :: mapをtypedefしようとしています。しかし、私はテンプレートのパラメータを指定したくありません。私がこれまでに読んだことから、公式のC++ 0x標準が利用可能になるまで、引数なしでテンプレートをtypedef'ingすることはできません。だから誰もこれのためのエレガントな回避策を知っていますか?テンプレートパラメータを指定せずにテンプレートクラスをtypedef

#ifdef _TR1 
#include <unordered_map> 
typedef std::tr1::unordered_map MyMap; //error C2976: too few template arguments 
#else 
#include <map> 
typedef std::map MyMap; //error C2976: too few template arguments 
#endif 
+0

非常に近い質問をご覧ください:http://stackoverflow.com/questions/544842/c-typedef-ing-stlと提供された回答。テンプレートのtypedefは有効なC++コマンドではありません –

+1

Benoit - ありがとう、まさに私が探していたものです –

+0

非常によく似た質問:http://stackoverflow.com/questions/6907194/how-to-typedef-a-template-class答えはここには記載されていません: "エイリアステンプレート" in C++ 11 – Jayesh

答えて

36

私はこれが行わ見てきた方法は、テンプレート構造体でのtypedefをラップすることです:

template<typename KeyType, typename MappedType> 
struct myMap 
{ 
#ifdef _TR1 
    typedef std::tr1::unordered_map<KeyType, MappedType> type; 
#else 
    typedef std::map<KeyType, MappedType> type; 
#endif 
}; 

次に、あなたのコードの中で、あなたがそうのようにそれを呼び出す:

myMap<key, value>::type myMapInstance; 

それはかもしれあなたが望むものより少し冗長ですが、私はそれが現在のC++の状態を必要とすると考えています。

+3

C++でのテンプレートtypedefの不足をシミュレートするのは確かです。しかし、私はtypedefという名前を "value"の代わりに "type"と命名しましたが、それは意味的にはより正しいと思われ、より慣用的です。 –

+1

コードが更新されました。ありがとう – fbrereto

4

typedefには完全な型を使用する必要があります。

代わりに#defineマクロを使用してください。

+1

場合によっては、古い方法に戻すことが最善です。最善のダクトテーププログラミング。 –

+4

残念ながら、マクロはスコープを尊重しません。 – sellibitze

関連する問題