C++ 0x 有模板别名(有时称为模板类型定义)。见这里。当前的 C++ 规范没有。
你喜欢用什么来解决?容器对象或宏?你觉得它值得吗?
你喜欢用什么来解决?容器对象或宏?你觉得它值得吗?
规范的方法是使用这样的元函数:
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 约定。)
template <typename T> struct my_string_map : public std::map<std::string,T> { };
您不应该从没有虚拟析构函数的类继承。它与派生类中的析构函数在应该调用时没有被调用有关,并且您最终可能会得到未分配的内存。
话虽如此,您可以在上面的实例中 ***** 可能 ***** 摆脱它,因为您没有向派生类型添加更多数据。请注意,这不是背书。我仍然建议你不要这样做。你能做到这一点并不意味着你应该这样做。
编辑:是的,这是对 ShaChris23 帖子的回复。我可能错过了一些东西,因为它出现在他/她的信息上方而不是下方。
有时您可以为所有必要的类型显式地写出未模板化的 typedef。如果基类在多个模板参数上进行模板化,并且只有一种类型需要类型定义,那么您可以继承一个专门的类,其中 typedef 有效地包含在继承的类名称中。这种方法没有元函数方法那么深奥。