gpt4 book ai didi

c++ - 使用预处理器而不是可变参数模板构建的 Boost 变体

转载 作者:行者123 更新时间:2023-11-30 03:39:13 27 4
gpt4 key购买 nike

这是 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 {

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

最佳答案

如果您查看更新的 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 个模板参数的“默认参数”/占位符,而您通常只使用其中的几个。这真的让我很困扰,但更多有经验的人告诉我要克服它。 :) 我认为人们普遍认为可变参数模板会产生更好的错误消息和堆栈跟踪。

关于c++ - 使用预处理器而不是可变参数模板构建的 Boost 变体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38967429/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com