C ++ 0x有模板别名(有时也称为模板typedef)。见here。目前的C ++规范没有。
你喜欢用什么作为解决方法?容器对象还是宏? 你觉得它值得吗?
答案 0 :(得分:103)
你喜欢用什么作为解决方法?容器对象还是宏?你觉得它值得吗?
规范的方法是使用像这样的元函数:
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惯例。)
答案 1 :(得分:10)
template <typename T> struct my_string_map : public std::map<std::string,T> { };
您不应该从没有虚拟析构函数的类继承。它与派生类中的析构函数有关,它们应该在它们应该被调用时,你最终会得到未分配的内存。
据说你可以在上面的例子中使用*****,因为你没有向你的派生类型添加任何数据。请注意,这不是认可。我仍然建议你不要这样做。您可以这样做的事实并不意味着您应该。
编辑:是的,这是对ShaChris23帖子的回复。我可能错过了一些东西,因为它出现在他/她的信息之上而不是下面。答案 2 :(得分:0)
有时您可以为所有必要类型明确写出未模板化的typedef。如果基类是在多个模板args上进行模板化的,只有一个类型需要为typedefed,则可以继承一个特殊的类,其中typedef有效地包含在继承的类名中。这种方法不如元函数方法深刻。