为什么boost::fusion序列中的struct数组成员类型不能正确推导

Why is struct array member type within a boost::fusion sequence not correctly deduced?

本文关键字:不能 类型 组成员 数组 struct fusion boost 为什么      更新时间:2023-10-16

我有以下示例代码:

#include <iostream>
#include <typeinfo>
#include <boost/fusion/include/adapt_struct.hpp>
#include <boost/fusion/algorithm.hpp>
namespace MySpace
{
  struct TwoMembers
  {
    int intMember;
    char charMember[3];
  };
}
BOOST_FUSION_ADAPT_STRUCT(
  MySpace::TwoMembers,
  (int, intMember)
  (char, charMember[3])
)
struct FusionMemberPrinter
{
  FusionMemberPrinter() {}
  template <typename U>
  void operator()(U& data) const {
    std::cout << typeid(U).name() << " " << sizeof(U) << std::endl;
  }
};
int main(int argc, char** argv) {
  MySpace::TwoMembers data;
  boost::fusion::for_each(data, FusionMemberPrinter());
  return 0;
}

至少在VS 2013 Update 2中,这段代码输出:

int 4
char 1

为什么charMember的类型不是char[3]而是char?操作符()将参数作为U&,因此我的期望是将其推导为char[3]。

我错在哪里,顺便说一下。我需要做些什么来改变char[3]的推导?

提前感谢!

宏BOOST_FUSION_ADAPT_STRUCT接受由(member_type, member_name)组成的元组序列。在你的数组中,它实际上被指定为一个char类型:(char, charMember[3])。很有可能编译结果是不正确的:

 //! Here's a snippet of the expanded macro:
 template< >
 struct access::struct_member< MySpace::TwoMembers, 1 >
 {
     //! Note the type is defined as char.
     typedef char attribute_type;
     typedef attribute_type type;
     template<typename Seq> 
     struct apply
     {
          //[...] 
          //! Note that the method to return the sequence member actually returns 
          //! a char 1 index past the end of the array.
          static type call(Seq& seq) { return seq.charMember[3]; }
     };
 };

你可以试试用boost::array<char, 3>代替。

#include <boost/array.hpp>
typedef boost::array<char, 3> char_array_3;
namespace MySpace
{
    struct TwoMembers
    {
        int intMember;
        char carray[3];
        char_array_3 charMember;
    };
}
BOOST_FUSION_ADAPT_STRUCT(
    MySpace::TwoMembers,
    (int, intMember)
    (char_array_3, charMember)
    )

到目前为止,我为自己找到的一个解决方案是:

using char3 = char[3];
namespace MySpace
{
  struct TwoMembers
  {
    int intMember;
    char3 charMember;
  };
}
相关文章: