2012-03-05 37 views
4

這可能有點愚蠢的問題,但我只需要問它。我想用C++中的unordered_map類,但不是每次引用它作爲TR1 :: unordered_map,我想只使用關鍵字hashMap.I知道如何爲tr1 :: unordered_map定義一個不綁定模板參數的宏/ typedef/etc?

typedef tr1::unordered_map<string, int> hashMap 

的作品,但那種修復了的鍵和對應的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類型沒有虛擬析構函數。

相關問題