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

Matching a sequence of two integers into an `std::pair<int, int>`

我正在尝试使用 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_ 不是定义匹配 (并设置为属性) 两个整数的解析器的正确方法吗?

实际上,@T.C。包含 <boost/fusion/adapted/std_pair.hpp> 的注释仅足以使编译器静音,而不能正确解析您的字符串。我还必须将 x3::parse() 更改为跳过空格的 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;
}

Live Example

请注意,我还用名称空间别名 x3 替换了您的 using namespace boost::spirit::x3。这将保持可读性,但会防止将大量 Boost.Spirit 符号转储到您的代码中。