为什么boost::fusion序列中的struct数组成员类型不能正确推导
Why is struct array member type within a boost::fusion sequence not correctly deduced?
我有以下示例代码:
#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;
};
}
相关文章:
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 不能将 "void *" 类型的值分配给类型 "TCHAR" 的实体
- 需要帮助在 c++ 中将字符串转换为字符 ----错误 "const char *" 类型的值不能用于初始化 "char" 类型的实体
- 为什么 int 类型的枚举类值不能用作 int
- 声明C++具有动态大小的数组类型在 Linux 中工作正常,但不能在 Windows 中工作
- 类型为 "Bucket&"(未限定的 const 限定)的引用不能使用 "SortedList." 类型的值进行初始化 如何修复此错误?
- 为什么"具有常量成员的结构"类型的指针不能指向"具有非常量成员的结构"?
- 为什么函数名不能与返回名类型相同?
- 运算符'<'不能应用于类型 'string' 和 'string' 的操作数
- 为什么我不能在运算符=中使用引用类型?
- "const wchar_t *" 类型的值不能用于初始化类型 "const PWSTR" 的实体
- Visual Studio C++:不能使用类型为 "const wchar_t *" 的值来初始化类型为 "TCHAR *" 的实体
- 不能使这种类型的"void(C::* volatile)(int) const "在参考手册C++示
- 为什么我不能在不进行任何转换的情况下将浮点数放入任何类型的 ptr 中?
- 为什么带有指针子对象的文字类类型的 constexpr 表达式不能是非类型模板参数
- 受保护的嵌套结构不能用作派生外部类中的返回类型?
- 不能将 "void *" 类型的值分配给类型 "RANDOMSTRUCT *" 的实体
- 为什么std::{container}::template不能推导其参数类型
- 为什么不能在C++中重新定义类中的类型名称?