模板typedefs-您的工作是什么?


Answers:


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在内的许多库中也使用了它。我们在生物信息学图书馆中广泛使用它。

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

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


3
如果您使用“类型”而不是“类型”(或除此之外),则与Boost.MPL一起使用会更好。这可能很有用,所以我认为这是一个鼓励的好习惯。
丹尼尔·詹姆斯

5
@Zenikoder:称它为元函数是完全合理的,大多数C ++元编程专家都这样做(例如Boost人)。没有一个严格的定义,但就我个人而言,我将一切都称为一个元函数,在给定一些输入的情况下,它在编译时会产生类型或编译时常量。也就是说,在编译时从输入到输出的任何映射。我不知道存在任何更合理或更广泛接受的定义。最后,请问您为什么反对该用语?
Konrad Rudolph

4
@matthieu这是一个元函数,因为它在编译时会计算类型
Ghita 2012年

能否请您说明一下如何让函数返回该类型?
moki 2014年

@MoKi我不明白你的意思。
康拉德·鲁道夫2014年

10
template <typename T>
struct my_string_map : public std::map<std::string,T> 
{
};

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

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

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


3
这是对ShaChris23帖子的回复吗?
埃文·特兰

这些不是论坛,帖子不会按时间顺序显示。通常,这将是一条评论。您不能,所以社区Wiki答案可能会做。不管怎样,这个问题已经很老了。
GManNickG 2010年

4
我注意到它已经很旧了,但是我认为确保不鼓励不正确的做法是一件好事。ttyl
xghost 2010年

0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.