【问题标题】:Boost Fusion struct with multi-argument template type chokes on comma使用逗号上的多参数模板类型扼流圈来提升 Fusion 结构
【发布时间】:2014-05-08 21:21:31
【问题描述】:

如何制作以下 Boost Fusion 结构?

#include <array>
#include <boost/fusion/include/define_struct_inline.hpp>

BOOST_FUSION_DEFINE_STRUCT_INLINE(
  MyStruct,
  (std::array<int, 3>, foo)
)

这无法编译(GCC 4.8.1 和 Boost 1.53),因为 std::array&lt;int, 3&gt; 被解释为 2 个参数而不是 1 个。

请注意,我不是在询问上面显示的特殊情况(这只是一个示例)。这个特殊问题有一个简单的解决方案,只需使用typedef std::array&lt;int, 3&gt; Int3Array;

我问的是在 Boost Fusion 结构的字段列表中使用具有多个以逗号分隔的模板参数的类型作为类型的一般问题。最终,我想使用一个模板 Boost Fusion 结构,我无法提前定义 typedef。例如,我可能想做这样的事情:

BOOST_FUSION_DEFINE_TPL_STRUCT_INLINE(
  (A)(B)(C),
  MyAdvancedStruct,
  (A<B, C>, bar)
)

【问题讨论】:

标签: c++ templates boost comma


【解决方案1】:

可行的解决方法是

BOOST_FUSION_DEFINE_STRUCT_INLINE(
  MyStruct,
  (decltype(std::array<int, 3>()), foo)
)

当然要使其/普遍/适用

BOOST_FUSION_DEFINE_STRUCT_INLINE(
MyStruct,
(boost::remove_reference<decltype(std::declval<std::array<int, 3>>())>::type, foo)
)

这似乎需要另一个宏...但是,哦等等 :) BOOST_PP_COMMA 似乎是更好的选择。

概念证明:http://coliru.stacked-crooked.com/a/f8b407b810fcfdc0

【讨论】:

  • 这太好了,谢谢!如果类型没有默认构造函数(即 decaltype(Type()) 不起作用),我是否正确理解您的通用解决方案(使用 std::declval 等)?如果是这样,这种情况将永远不会出现,因为如果在 Boost Fusion 结构中使用没有默认构造函数的类型,那么当 Boost 尝试为该结构实现默认构造函数时会出现编译时错误......但是很好您提到了完整性的通用解决方案。
  • 如何使用 BOOST_PP_COMMA 完成这项工作? (std::array&lt;int BOOST_PP_COMMA() 3&gt;, foo) 不起作用。
  • @Flecto 啊哈。看来你是对的。那么,我的解决方法有一些优点。我希望你的课程是默认可构造的,所以你不需要可怕的declval&lt;&gt; dance
【解决方案2】:

如果您不能使用typedefusing 声明,请尝试像这样使用Boost.IdentityType

#include <array>
#include <boost/fusion/include/define_struct_inline.hpp>
#include <boost/utility/identity_type.hpp>

BOOST_FUSION_DEFINE_STRUCT_INLINE(
  MyStruct,
  (typename BOOST_IDENTITY_TYPE((std::array<int, 3>)), foo)
)

int main()
{
    MyStruct x;
    static_assert(boost::is_same<decltype(x.foo), std::array<int, 3> >::value, "yup");
}

Coliru live demo

【讨论】:

    猜你喜欢
    • 2019-04-30
    • 1970-01-01
    • 2011-06-16
    • 2021-11-21
    • 2013-01-22
    • 1970-01-01
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    相关资源
    最近更新 更多