2012-03-05 5 views
4

これは少しばかげた質問かもしれませんが、私はそれに尋ねる必要があります。私はC++でunordered_mapクラスを使用しようとしていますが、代わりにTR1 :: unordered_mapとして毎回それを参照するのは、私はちょうどキーワードhashMap.Iを使用したいというテンプレート引数をバインドしないtr1 :: unordered_mapのマクロ/ typedef/etcを定義するにはどうすればよいですか?

typedef tr1::unordered_map<string, int> hashMap 

作品が、修正のようなものを知っていますキーと私はより以下のように持ちたいのに対し、ハッシュマップに対応する値のデータ型:

私はちょうどキーと要件に応じて、値のデータ型を定義しますが、このことができ
#define hashMap tr1::unordered_map 

動作しません。誰もこの問題に直面していましたか?

おかげ

答えて

5

これは、C++ 11以前ではC++にはなかったものです。 C++ 11では、template usingを使用することができます。

template<typename Key, typename Value> 
using hashMap = tr1::unordered_map<Key, Value>; 

C++ 03のための通常の回避策はtypeメンバーでテンプレート構造を作ることです:クラスから継承

template<typename Key, typename Value> 
struct hashMap { 
    typedef tr1::unordered_map<Key, Value> type; 
}; 
// then: 
hashMap<string, int>::type myMap; 

が可能ですSTLクラスは継承されないため、通常、ユーザーはこれをやめます。

2

一つの可能​​性は、テンプレートのHashMap derrivedクラスを通じてunordered_mapするキー/値のペアを転送するために、継承を使用することです。 IE:

template<typename key, typename value> 
class hashMap : public tr1::unordered_map<key, value> 
{ 
public: 
    // Add constructors to forward to tr1::unordered_map's constructors as 
    // needed 
    hashMap() : tr1::unordered_map<key, value>() {} 
    //... 
}; 

その後、テンプレートとしてHashMapを使用することができますが、実際にunordered_mapのパブリックインターフェイスを使用すること。

hashMap<string, int> foo; 
foo["bar"] = 5; 

STLタイプには仮想デストラクタがないため、フォワード以外の面白いことはしないでください。

関連する問題