如何在c ++中使用typedef作为泛型类

时间:2011-06-13 14:41:11

标签: c++ typedef template-meta-programming

我正在尝试使用unordered_map。但在某些服务器中我们没有tr1库。在那些情况下,我想使用地图。 所以,我想写一个头文件,我将使用以下行之一。

typedef tr1::unordered_map hashmap;
typedef map hashmap;

我的问题是我在这里使用不同类型的地图。

map<string, string>
map<string, int>
map <string, map<string,int>> ..etc

如果我可以使用typedef别名map或unordered_map作为hashmap,那么我可以在代码中将地图用作hashmap<string, string>hashmap<int, int>

有没有办法做到这一点或如果有更好的方法请建议我。

由于 维诺德

3 个答案:

答案 0 :(得分:10)

你需要使用一个所谓的元函数:

template <typename Key, typename T>
struct hashmap {
    typedef std::unordered_map<Key, T> type;
    // or
    //typedef std::map<Key, T> type;
};

将使用这样的:

hashmap<int, float>::type some_map;

这是一种非常常见的模式。通过提供改进的using语句,C ++ 0x使这更容易一些,但目前这是最好的。

答案 1 :(得分:2)

C ++ 98和03不支持模板typedef,但你可以用C ++ 0x来实现。

在早期版本中,您可以使用具有值typedef的模板结构来执行您想要的操作:

template <typename T1, typename T2>
struct hashmap
{
    typedef std::map<T1, T2> type;
};

请注意,这是出于污染目的,您可能还需要额外的模板参数来覆盖比较运算符和分配器。

答案 2 :(得分:2)

这可以在c ++ 0x中实现,但目前不支持别名非专用模板。请参阅:https://en.wikipedia.org/wiki/C%2B%2B0x#Template_aliases

作为一种解决方法,您可以使用宏代表地图类型,即:

#ifdef HAVE_TR1
#include <tr1/unordered_map>
#define HASH_MAP std::tr1::unordered_map
#else
#include <map>
#define HASH_MAP std::map
#endif

在一个不相关的说明中,我会将别名称为“ASSOC_MAP”,甚至只调用“MAP”而不是“HASH_MAP”。后一个名称听起来像是在使用哈希,让用户认为它具有恒定时间的插入和删除,而不是O(log N)。