提问人:George Godik 提问时间:8/25/2008 最后编辑:Yochai TimmerGeorge Godik 更新时间:9/2/2015 访问量:41185
模板 typedefs - 您的解决方法是什么?
Template typedefs - What's your work around?
答:
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 有效地包含在继承的类名中。这种方法不如元函数方法深奥。
评论