模板typedef - 你的工作是什么?

时间:2008-08-25 14:47:01

标签: c++ templates type-safety

C ++ 0x有模板别名(有时也称为模板typedef)。见here。目前的C ++规范没有。

你喜欢用什么作为解决方法?容器对象还是宏? 你觉得它值得吗?

3 个答案:

答案 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有效地包含在继承的类名中。这种方法不如元函数方法深刻。