模板 typedefs - 您的解决方法是什么?

Template typedefs - What's your work around?

提问人:George Godik 提问时间:8/25/2008 最后编辑:Yochai TimmerGeorge Godik 更新时间:9/2/2015 访问量:41185

问:

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

你喜欢用什么来解决问题?容器对象还是宏? 你觉得值得吗?

C++ 模板 类型安全

评论

3赞 Assaf Lavie 9/16/2008
GOTW 不久前处理了这个话题:gotw.ca/gotw/079.htm

答:

106赞 Konrad Rudolph 8/25/2008 #1

你喜欢用什么来解决问题?容器对象还是宏?你觉得值得吗?

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

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 () 和许多库(包括 Boost)。我们在生物信息学图书馆中广泛使用它。allocator::rebind<U>

它很臃肿,但在 99% 的情况下它是最好的选择。在这里使用宏不值得许多缺点。

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

评论

3赞 Daniel James 9/16/2008
如果您使用“type”而不是“Type”(或除此之外),这将更好地与 Boost.MPL 配合使用。这可能很有用,所以我认为这是一个很好的鼓励惯例。
5赞 Konrad Rudolph 1/24/2011
@Zenikoder:称它为元函数是完全合理的,大多数C++元编程专家都是这样做的(例如 Boost 人)。没有一个严格的定义,但就我个人而言,我把所有东西都称为元函数,在编译时,在给定一些输入的情况下,会生成一个类型或编译时常量。也就是说,在编译时从输入到输出的任何映射。我不知道有没有更合理或更广泛接受的定义。最后,我能问一下你为什么反对这个词的这种用法吗?
4赞 Ghita 5/20/2012
@matthieu它是一个元函数,因为它在编译时计算一个类型
0赞 max 8/19/2014
您能否添加有关如何让函数返回此类型的解释?
0赞 Konrad Rudolph 9/2/2014
@MoKi 我不明白你的意思。
12赞 xghost 1/19/2010 #2
template <typename T>
struct my_string_map : public std::map<std::string,T> 
{
};

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

话虽如此,您可以*****可能*****在上面的实例中摆脱它,因为您没有向派生类型添加更多数据。请注意,这不是认可。我仍然建议你不要这样做。你可以做到的事实并不意味着你应该这样做。

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

评论

3赞 Evan Teran 1/19/2010
这是对 ShaChris23 帖子的回复吗?
0赞 GManNickG 1/19/2010
这些不是论坛,帖子不按时间顺序显示。通常,这将是一个评论。你不能,所以也许社区维基的答案就可以了。无论哪种方式,这个问题都由来已久。
4赞 xghost 1/19/2010
我注意到它已经很老了,但我认为确保它不会鼓励不正确的做法是一件好事。TTYL型
0赞 Andrei Pokrovsky 3/19/2013 #3

有时,您可以为所有必要的类型显式写出未模板化的 typedef。如果基类在多个模板参数上模板化,并且只有一个类型需要类型定义,则可以继承一个专用类,其中 typedef 有效地包含在继承的类名中。这种方法不如元函数方法深奥。