74

C++ 0x 有模板别名(有时称为模板类型定义)。见这里。当前的 C++ 规范没有。

你喜欢用什么来解决?容器对象或宏?你觉得它值得吗?

4

3 回答 3

104

你喜欢用什么来解决?容器对象或宏?你觉得它值得吗?

规范的方法是使用这样的元函数:

template <typename T>
struct my_string_map {
    typedef std::map<std::string, T> type;
};

// Invoke:

my_string_map<int>::type my_str_int_map;

这也用于 STL ( allocator::rebind<U>) 和包括 Boost 在内的许多库中。我们在生物信息库中广泛使用它。

它很臃肿,但它在 99% 的时间里都是最好的选择。在这里使用宏不值得这么多缺点。

(编辑:我已经修改了代码以反映 Daniel 在他的评论中指出的 Boost/STL 约定。)

于 2008-08-25T14:51:01.920 回答
12
template <typename T>
struct my_string_map : public std::map<std::string,T> 
{
};

您不应该从没有虚拟析构函数的类继承。它与派生类中的析构函数在应该调用时没有被调用有关,并且您最终可能会得到未分配的内存。

话虽如此,您可以在上面的实例中 ***** 可能 ***** 摆脱它,因为您没有向派生类型添加更多数据。请注意,这不是背书。我仍然建议你要这样做。你做到这一点并不意味着你应该这样做。

编辑:是的,这是对 ShaChris23 帖子的回复。我可能错过了一些东西,因为它出现在他/她的信息上方而不是下方。

于 2010-01-18T23:01:11.320 回答
0

有时您可以为所有必要的类型显式地写出未模板化的 typedef。如果基类在多个模板参数上进行模板化,并且只有一种类型需要类型定义,那么您可以继承一个专门的类,其中 typedef 有效地包含在继承的类名称中。这种方法没有元函数方法那么深奥。

于 2013-03-19T00:31:33.683 回答