将两个整数的序列匹配到 `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);
}
但是,它只匹配第一个整数。如果我将 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;
}
请注意,我还用名称空间别名 x3
替换了您的 using namespace boost::spirit::x3
。这将保持可读性,但会防止将大量 Boost.Spirit 符号转储到您的代码中。
我正在尝试使用 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_
不是定义匹配 (并设置为属性) 两个整数的解析器的正确方法吗?
实际上,@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;
}
请注意,我还用名称空间别名 x3
替换了您的 using namespace boost::spirit::x3
。这将保持可读性,但会防止将大量 Boost.Spirit 符号转储到您的代码中。