2009-09-24 84 views
26

我試圖typedef unordered_map或std :: map,取決於是否有TR1庫可用。但我不想指定模板參數。從我目前閱讀的內容來看,沒有參數的typedef'ing模板是不可能的,除非官方的C++ 0x標準可用。那麼有沒有人知道這個優雅的解決方法?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和提供的答案。模板typedefs是無效的C++命令 – 2009-09-24 22:21:12

+1

Benoit - 謝謝,多數民衆贊成正是我正在尋找 – 2009-09-24 22:31:09

+0

非常類似的問題:http://stackoverflow.com/questions/6907194/how-to-typedef-a-template-class它有另一個答案,這裏沒有提到:「別名模板」在c + + 11 – Jayesh 2014-07-31 02:18:12

回答

36

我見過這樣做的方式是包裝在模板結構的類型定義:

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命名爲「type」而不是「value」,從語義上講它更正確,而且更具慣用性。 – 2009-09-25 12:13:15

+1

代碼已更新,謝謝 – fbrereto 2009-09-25 18:52:24

4

您必須使用typedefs的完整類型。

改爲使用#define宏。

+1

有時最好回退舊的方式。最好的管道磁帶編程。 – 2009-09-24 22:17:28

+4

不幸的是宏不尊重範圍。 – sellibitze 2009-09-25 12:28:50