模板 typedefs - 你的工作是什么?
-
09-06-2019 - |
题
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 帖子的回复。我可能错过了一些东西,因为它显示在他/她的消息上方而不是下方。
有时,您可以显式地写出所有必要类型的非模板化类型定义。如果基类在多个模板参数上进行模板化,并且只有一种类型需要进行 typedefed,则您可以继承一个专用类,并将 typedef 有效地包含在继承的类名中。这种方法没有元函数方法那么深奥。
不隶属于 StackOverflow