【问题标题】:Template typedefs - What's your work around?模板类型定义 - 你的工作是什么?
【发布时间】:2010-09-06 18:29:38
【问题描述】:

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

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

【问题讨论】:

标签: c++ templates type-safety


【解决方案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 (allocator::rebind&lt;U&gt;) 和包括 Boost 在内的许多库中。我们在bioinformatical library 中广泛使用它。

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

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

【讨论】:

  • 如果您使用 'type' 而不是 'Type' (或除此之外),这将更适用于 Boost.MPL。这可能很有用,所以我认为这是一个很好的鼓励惯例。
  • @Zenikoder:将其称为元函数是完全合理的,大多数 C++ 元编程专家都这样做(例如 Boost 人)。不存在一个严格的定义,但我个人称一切为元函数,在编译时,给定一些输入,产生一个类型或编译时常量。也就是说,在编译时从输入到输出的任何映射。我不知道是否存在任何更合理或更广泛接受的定义。最后,我能问一下你为什么反对这个词的这种用法吗?
  • @matthieu 它是一个元函数,因为它在编译时计算一个类型
  • 能否请您补充说明如何让函数返回此类型?
  • @MoKi 我不明白你的意思。
【解决方案2】:
template <typename T>
struct my_string_map : public std::map<std::string,T> 
{
};

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

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

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

【讨论】:

  • 这是对 ShaChris23 帖子的回复吗?
  • 这些不是论坛,帖子不按时间顺序出现。通常,这将是一个评论。你不能,所以也许社区 wiki 的答案就可以了。不管怎样,这个问题已经很老了。
  • 我注意到它已经很老了,但我认为确保它不会鼓励不正确的做法是一件好事。 ttyl
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    • 1970-01-01
    • 2011-06-27
    • 1970-01-01
    • 2011-02-17
    • 2011-09-26
    相关资源
    最近更新 更多