将两个整数的序列匹配到`std :: pair <int,int =“”>`

时间:2016-08-07 16:35:53

标签: c++ c++14 boost-fusion boost-spirit-x3

我尝试使用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);
}

melpon.org link

但是,它只匹配第一个整数。如果我将std::pair<int, int> result;更改为int result;然后打印result,我会将1作为输出。

为什么会这样?不是int_ >> int_定义匹配(并设置为属性)两个整数的解析器的正确方法吗?

1 个答案:

答案 0 :(得分:5)

实际上,@ T.C。包含<boost/fusion/adapted/std_pair.hpp>的注释仅足以使编译器静音,而不是正确解析字符串。我还必须更改跳过空白的x3::parse()的{​​{1}}:

x3::phrase_parse()

Live Example

请注意,我还将#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符号转储到您的代码中。