【发布时间】:2020-06-28 21:16:49
【问题描述】:
我正在尝试使用包含单个成员的融合适应 Struct 类型解析 std::Variant。经过几个小时的尝试找出问题后,我能够使用以下代码重现问题:
struct TestStruct {
float value;
};
BOOST_FUSION_ADAPT_STRUCT(TestStruct, value)
typedef std::variant<TestStruct, std:string> TestVariant;
auto TestStructRule = x3::rule<struct test_struct, TestStruct>{} = x3::float_ >> ",";
auto TestVariantRule = x3::rule<struct test_variant, TestVariant>{} = TestStruct | "default" >> x3::attr(std::String{"default"});
这会导致以下构建错误:
boost/boost/spirit/home/x3/support/traits/move_to.hpp:67:18: error: no viable overloaded '='
dest = std::move(fusion::front(src));
boost/boost/spirit/home/x3/support/traits/move_to.hpp:79:13: note: in instantiation of function template specialization 'boost::spirit::x3::traits::detail::move_to_plain<TestStruct, std::__1::variant<TestStruct, std::string> >' requested here
move_to_plain(std::forward<Source>(src), dest, is_single_element_sequence);
...
/Library/Developer/CommandLineTools/usr/include/c++/v1/variant:1214:12: note: candidate function not viable: no known conversion from 'typename remove_reference<float &>::type' (aka 'float') to 'const std::__1::variant<TestStruct, std::String>' for 1st argument
variant& operator=(const variant&) = default;
^
/Library/Developer/CommandLineTools/usr/include/c++/v1/variant:1215:12: note: candidate function not viable: no known conversion from 'typename remove_reference<float &>::type' (aka 'float') to 'std::__1::variant<TestStruct, std::String>' for 1st argument
variant& operator=(variant&&) = default;
我觉得莫名其妙的是,如果我向TestStruct 添加第二个成员,以下代码实际上会正确编译和运行:
struct TestStruct {
float value1;
float value2; // <-- Added second member
};
BOOST_FUSION_ADAPT_STRUCT(TestStruct, value1, value2)
typedef std::variant<TestStruct, std:string> TestVariant;
auto TestStructRule = x3::rule<struct test_struct, TestStruct>{} = x3::float_ >> "," >> x3::float_ >> ",";
auto TestVariantRule = x3::rule<struct test_variant, TestVariant>{} = TestStruct | "default" >> x3::attr(std::String{"default"});
我也读过 SO,当尝试用旧版本的 Spirit 解析这些时,融合适应的单字段结构存在已知问题。
解决(或绕过)Spirit X3 这个问题的最佳方法是什么?
【问题讨论】:
-
只需添加一个赋值运算符即可。 “适应”使结构表现为元组。
标签: c++ boost boost-spirit boost-spirit-x3 boost-fusion