C++ 模板typedefs-What';你的工作怎么样?

C++ 模板typedefs-What';你的工作怎么样?,c++,templates,type-safety,C++,Templates,Type Safety,C++0x有模板别名(有时称为模板typedef)。看见当前的C++规范没有。p> 你喜欢用什么作为工作场所?容器对象还是宏? 你觉得值得吗 你喜欢用什么作为工作场所?容器对象还是宏?你觉得值得吗 规范的方法是使用如下的元函数: template <typename T> struct my_string_map { typedef std::map<std::string, T> type; }; // Invoke: my_string_map<in

C++0x有模板别名(有时称为模板typedef)。看见当前的C++规范没有。p> 你喜欢用什么作为工作场所?容器对象还是宏? 你觉得值得吗

你喜欢用什么作为工作场所?容器对象还是宏?你觉得值得吗

规范的方法是使用如下的元函数:

template <typename T>
struct my_string_map {
    typedef std::map<std::string, T> type;
};

// Invoke:

my_string_map<int>::type my_str_int_map;
模板
结构我的字符串映射{
typedef std::映射类型;
};
//调用:
我的字符串映射::键入我的字符串映射;
这也用于STL(
allocator::rebind
)和包括Boost在内的许多库中。我们在一个特定的环境中广泛使用它

它有些臃肿,但99%的时候它是最好的选择。在这里使用宏不值得有很多缺点

(编辑:正如Daniel在评论中指出的那样,我修改了代码以反映Boost/STL约定。)

模板
struct my_string_map:public std::map
{
};
您不应该从没有虚拟析构函数的类继承。这与派生类中的析构函数在应该调用时没有被调用有关,最终可能会导致内存未分配

也就是说,在上面的实例中,您可以******可能******不受影响,因为您没有向派生类型添加更多数据。请注意,这不是背书。我仍然建议你不要这样做。你能做到这一点并不意味着你应该做到


编辑:是的,这是对ShaChris23帖子的回复。我可能错过了一些东西,因为它出现在他/她的邮件上方而不是下方。

有时候,您可以明确地写出所有必要类型的未模板typedef。如果基类在多个模板参数上模板化,并且只有一个类型需要进行typedef,则可以继承一个专门的类,该类的typedef有效地包含在继承的类名中。这种方法没有元函数方法那么深奥。

如果您使用“类型”而不是“类型”(或除此之外),那么使用Boost.MPL会更好。这可能是有用的,所以我认为这是一个很好的鼓励的惯例。@ Zeikod:完全称之为元功能是完全合理的,大多数C++元编程专家都这样做(例如,促进人)。虽然没有一个严格的定义,但就我个人而言,我把所有东西都称为一个元函数,在编译时,在给定一些输入的情况下,它会产生一个类型或编译时常量。也就是说,在编译时从输入到输出的任何映射。我不知道有任何更合理或更广泛接受的定义存在。最后,我能问一下你为什么反对这个术语的使用吗?@matthieu这是一个元函数,因为它在编译时计算一个类型。你能解释一下如何让函数返回这个类型吗?@MoKi我不明白你的意思。这是对ShaChris23帖子的回复吗?这些不是论坛,帖子不按时间顺序出现。通常,这将是一个评论。你不能,所以也许一个社区维基答案就可以了。不管怎样,这个问题已经很老了。我注意到它已经很老了,但我认为确保它不会鼓励不正确的做法是件好事。ttylGOTW不久前讨论过这个话题:
template <typename T>
struct my_string_map : public std::map<std::string,T> 
{
};