关于c ++:Template typedefs-您的工作是什么?

关于c ++:Template typedefs-您的工作是什么?

Template typedefs - What's your work around?

C ++ 0x具有模板别名(有时称为模板typedef)。 看这里。 当前的C ++规范没有。

您喜欢在工作中使用什么? 容器对象还是宏?
您觉得值得吗?


What do you like to use as work around ? Container objects or Macros ? Do you feel its worth it ?

规范的方法是使用像这样的元函数:

1
2
3
4
5
6
7
8
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)和包括Boost在内的许多库中也使用了它。我们在生物信息学图书馆中广泛使用它。

它ated肿了,但是99%的时间是最好的选择。在这里使用宏是不值得承担许多缺点的。

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


1
2
3
4
template <typename T>
struct my_string_map : public std::map<std::string,T>
{
};

您不应该从没有虚拟析构函数的类继承。这与派生类中的析构函数在应有的时候没有被调用有关,您可能会得到未分配的内存。

话虽这么说,但您可以*****可能*****在上面的实例中摆脱它,因为您不会在派生类型中添加更多数据。请注意,这不是背书。我仍然建议您不要这样做。您可以做到这一点并不意味着您应该这样做。

编辑:是的,这是对ShaChris23帖子的回复。我可能错过了一些内容,因为它显示在他/她的信息上方而不是下方。


有时,您可以为所有必需的类型明确写出未模板化的typedef。如果基类在多个模板args上进行模板化,并且只希望使用一种类型进行类型定义,则您可以继承一个带有typedef的专用类,该类实际上包含在继承的类名中。这种方法不如元函数方法那么抽象。


推荐阅读