Boost.Spirit.X3解析到std::tuple时报错期望tuple-like类型问题
问题原因
该编译错误并非std::tuple不属于tuple-like类型,而是Boost.Spirit.X3内部使用Boost.Fusion库处理属性类型的序列化与匹配,默认没有启用std::tuple的类型适配,因此Spirit无法识别传入的std::tuple<int, double>是符合要求的属性类型。
解决方案
只需在代码中额外引入Boost.Fusion的std_tuple适配头即可:
#include <boost/fusion/adapted/std_tuple.hpp>
提示:若后续需要使用
std::pair、std::array等其他标准库类型作为Spirit的解析属性,也需要对应引入boost/fusion/adapted/目录下的对应适配头文件。
修改后的完整可编译代码
#include <string> #include <tuple> #include <boost/spirit/home/x3.hpp> #include <boost/fusion/adapted/std_tuple.hpp> void parseInteger(std::string input) { namespace x3 = boost::spirit::x3; auto iter = input.begin(); auto end_iter = input.end(); int result; x3::parse(iter, end_iter, x3::int_, result); } void parseIntegerAndDouble(std::string input) { namespace x3 = boost::spirit::x3; auto iter = input.begin(); auto end_iter = input.end(); std::tuple<int, double> result; x3::parse(iter, end_iter, x3::int_ >> ' ' >> x3::double_, result); } int main(int, char **) { parseInteger("567"); parseIntegerAndDouble("321 3.1412"); return 0; }
内容的提问来源于stack exchange,提问作者Niels Holst
相关产品推荐
相关产品推荐

