不指定模板参数的情况下,定义一个模板类的类型别名

26

我正在尝试typedef一个无序映射或std :: map,这取决于是否有TR1库。但我不想指定模板参数。到目前为止,根据我所读的,非官方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

1
请参考这个非常相似的问题:https://dev59.com/E3RB5IYBdhLWcg3wtJKF以及提供的答案。模板typedef不是有效的C++命令。 - Benoît
非常相似的问题:https://dev59.com/S2w05IYBdhLWcg3w_Guw 它有另一个答案,这里没有提到:“alias template”在c++11中。 - Jayesh
2个回答

38

我看过的做法是将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++中模拟模板typedefs的缺少通常采用这种方式。但是,我会将typedef命名为"type"而不是"value",从语义上讲更加正确,而且更符合惯用法。 - Luc Touraille

4

你必须对typedef使用完整的类型。

应该使用#define宏代替。


1
有时候回归老方法是最好的选择。这就是最好的“胶带编程”。 - Mark Ransom
5
不幸的是,宏不遵循作用域。 - sellibitze

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接