我尝试使用Boost.Sprit x3将两个整数的序列匹配到std::pair<int, int>
。根据文档判断,应编译以下代码:
#include <string>
#include <boost/config/warning_disable.hpp>
#include <boost/spirit/home/x3.hpp>
int main()
{
using namespace boost::spirit::x3;
std::string input("1 2");
std::pair<int, int> result;
parse(input.begin(), input.end(), int_ >> int_, result);
}
但是,它只匹配第一个整数。如果我将std::pair<int, int> result;
更改为int result;
然后打印result
,我会将1
作为输出。
为什么会这样?不是int_ >> int_
定义匹配(并设置为属性)两个整数的解析器的正确方法吗?
答案 0 :(得分:5)
实际上,@ T.C。包含<boost/fusion/adapted/std_pair.hpp>
的注释仅足以使编译器静音,而不是正确解析字符串。我还必须更改跳过空白的x3::parse()
的{{1}}:
x3::phrase_parse()
请注意,我还将#include <iostream>
#include <string>
#include <boost/config/warning_disable.hpp>
#include <boost/spirit/home/x3.hpp>
#include <boost/fusion/adapted/std_pair.hpp>
int main()
{
namespace x3 = boost::spirit::x3;
std::string input("1 2");
std::pair<int, int> result;
auto ok = x3::phrase_parse(input.begin(), input.end(), x3::int_ >> x3::int_, x3::space, result);
std::cout << std::boolalpha << ok << ": ";
std::cout << result.first << ", " << result.second;
}
替换为命名空间别名using namespace boost::spirit::x3
。这将保持可读性,但可以防止将大量的Boost.Spirit符号转储到您的代码中。