【问题标题】:Boost variant built with preprocessor and not variadic templates使用预处理器而不是可变参数模板构建的 Boost 变体
【发布时间】:2016-08-16 05:48:03
【问题描述】:

这是来自variant.hpp 文件的相关代码(在这里找到http://www.boost.org/doc/libs/1_49_0/boost/variant/variant.hpp

template <
      typename T0_
    , BOOST_VARIANT_ENUM_SHIFTED_PARAMS(typename T)
    >
class variant {

为什么这不是用可变参数模板构建的?答案可能是因为向后兼容。如果是,那么上面的代码在高层次上到底发生了什么?如何以类似于从用户级别使用可变参数模板的方式使用预处理器?

【问题讨论】:

标签: c++ c++11 boost variadic-templates boost-preprocessor


【解决方案1】:

如果您查看更新的 boost 版本,那么是的,它将使用可变参数模板,如果它们在您的编译器上可用。

如果您没有可变参数模板,简短的回答是,它使用 boost::mpl 代替,并修复最多 20 种左右的值类型。它使用预处理器为最大 20 的类型序列生成样板。

请看这里例如:http://www.boost.org/doc/libs/1_61_0/doc/html/BOOST_VARIANT_LIMIT_TYPES.html

主要缺点是:

  • 它对编译时间有害,因为它必须扩展大量宏
  • 如果您必须查看回溯/错位类型名称,并且它们会通过 boost::variant 函数,您会收到大量 boost::detail::variant::void_ 垃圾邮件,这是 20 模板的“默认参数”/占位符当您通常只使用其中几个参数时。这真的让我很困扰,但更多有经验的人告诉我要克服它。 :) 我认为人们普遍认为可变参数模板会产生更好的错误消息和堆栈跟踪。

【讨论】:

  • 你指的是哪个版本的 boost?我刚刚从他们的网站上下载了 1_61_0,它仍然有相同的代码 :( (in boost/variant/variant.hpp)
  • @Curious 您使用的是什么编译器/版本?你在设置什么std=c++XYZ 标志?
  • @TinyT 哦,不,我刚刚下载了代码并进入了我提到的文件夹并查看了代码并没有找到可变参数模板......我还有什么要做的吗?
  • @Curious 看起来魔法正在 [boost.org/doc/libs/1_61_0/boost/variant/… 外面发生。那里的宏会根据编译器功能改变BOOST_VARIANT_ENUM_PARAMS 的含义。例如:你在构建 Boost 时是否指定了-std=c++11
  • 没有人能克服提升堆栈跟踪
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-19
  • 1970-01-01
  • 2014-11-09
相关资源
最近更新 更多