【发布时间】:2010-09-06 18:29:38
【问题描述】:
C++ 0x 具有模板别名(有时称为模板类型定义)。见here。当前的 C++ 规范没有。
你喜欢用什么来解决问题?容器对象或宏? 你觉得值得吗?
【问题讨论】:
-
GOTW 前段时间处理过这个话题:gotw.ca/gotw/079.htm
标签: c++ templates type-safety
C++ 0x 具有模板别名(有时称为模板类型定义)。见here。当前的 C++ 规范没有。
你喜欢用什么来解决问题?容器对象或宏? 你觉得值得吗?
【问题讨论】:
标签: c++ templates type-safety
你喜欢用什么来解决问题?容器对象或宏?你觉得值得吗?
规范的方法是使用这样的元函数:
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 在内的许多库中。我们在bioinformatical library 中广泛使用它。
它有点臃肿,但 99% 的情况下它都是最佳选择。在这里使用宏不值得这么多缺点。
(编辑:我已经修改了代码以反映 Daniel 在他的评论中指出的 Boost/STL 约定。)
【讨论】:
template <typename T> struct my_string_map : public std::map<std::string,T> { };
您不应该从没有虚拟析构函数的类继承。它与派生类中的析构函数在应该调用时没有被调用有关,并且您最终可能会得到未分配的内存。
话虽如此,您可以在上面的实例中 ***** 可能 ***** 摆脱它,因为您没有向派生类型添加更多数据。请注意,这不是背书。我仍然建议你不要这样做。你可以这样做并不意味着你应该。
编辑:是的,这是对 ShaChris23 帖子的回复。我可能错过了什么,因为它显示在他/她的消息上方而不是下方。
【讨论】:
有时您可以为所有必需的类型显式写出未模板化的 typedef。如果基类在多个模板参数上进行模板化,并且只有一种类型需要类型定义,那么您可以继承一个专门的类,其中 typedef 有效地包含在继承的类名称中。这种方法没有元函数方法那么深奥。
【讨论】: