如何用Boost.Fusion定义含字符数组成员的结构体?现有写法报错
如何用Boost.Fusion定义包含字符数组成员的结构体?
你遇到的问题本质是原生C-style数组的特性和Boost.Fusion的类型适配逻辑不兼容:原生数组无法直接值初始化,而且在函数参数传递时会自动退化为指针,导致Fusion内部的赋值逻辑出现类型不匹配。
最推荐的解决方案:用std::array替代原生数组
std::array是C++标准库提供的固定大小数组容器,它保留了原生数组的性能,同时具备值语义(可拷贝、可赋值),完美适配Boost.Fusion的要求。代码示例如下:
#include <boost/fusion/include/define_struct.hpp> #include <array> namespace demo { BOOST_FUSION_DEFINE_STRUCT( (demo), employee, (std::array<char, 10>, name) ) }
如果你坚持要用原生C-style数组
可以手动定义结构体后再用BOOST_FUSION_ADAPT_STRUCT适配,不过要注意原生数组的拷贝是浅拷贝,使用时需要额外小心:
#include <boost/fusion/include/adapt_struct.hpp> namespace demo { // 先手动定义结构体 struct employee { char name[10]; }; } // 适配到Boost.Fusion BOOST_FUSION_ADAPT_STRUCT( demo::employee, (char[10], name) )
为什么你的原有写法会报错?
- 第一种写法:
BOOST_FUSION_DEFINE_STRUCT内部会生成构造函数等代码,原生数组作为成员时,Fusion尝试用指针类型(const char* const)赋值给数组变量,类型不匹配导致报错。 - 第二种写法:
decltype(char10{})得到的是数组的左值引用类型(char (&)[10]),引用类型无法进行值初始化,因此编译失败。
内容的提问来源于stack exchange,提问作者lsr
相关产品推荐
相关产品推荐

