int_ >> int_
синтезирует кортеж int, int.¹
Если вы хотите принудительно синтезировать контейнер, сделайте его repeat(2) [ int_ ]
, чтобы выразить это.
Sidenote : Как вы увидите ниже, есть место для совместимости атрибутов, даже если связанный атрибут является дополнительным, поэтому вам не нужно.
Sidenote : auto
с выражениями синтаксического анализатора запрашивает неопределенное поведение: Назначение синтаксических анализаторов для авто переменных
Sidenote : ваш ввод использует разделитель пробелов, а анализатор - нет. Это никогда не сработает.
Ваш пример кода, похоже, не имеет ничего общего с целью, поэтому вот мой маленький пример:
1. vector<int>
:
Live On Coliru
#include <boost/spirit/include/qi.hpp>
using Vec = std::vector<int>;
namespace qi = boost::spirit::qi;
template <typename It> Vec parse_ivec(It first, It last) {
Vec v;
if (qi::phrase_parse(first, last, qi::int_ >> qi::int_ >> qi::eoi, qi::space, v))
return v;
throw std::runtime_error("Parse failed");
}
Vec parse_ivec(std::string const& r) { return parse_ivec(begin(r), end(r)); }
int main() {
for (int i : parse_ivec("12 13")) {
std::cout << i << "\n";
}
}
печать
12
13
2. Адаптированные структуры
В качестве альтернативы, если вам нужна структура, не std::vector<>
:
Live On Coliru
#include <boost/fusion/adapted/struct.hpp>
struct Vec { int a, b; };
BOOST_FUSION_ADAPT_STRUCT(Vec, a, b)
#include <boost/spirit/include/qi.hpp>
namespace qi = boost::spirit::qi;
template <typename It> Vec parse_ivec(It first, It last) {
Vec v;
if (qi::phrase_parse(first, last, qi::int_ >> qi::int_ >> qi::eoi, qi::space, v))
return v;
throw std::runtime_error("Parse failed");
}
Vec parse_ivec(std::string const& r) { return parse_ivec(begin(r), end(r)); }
int main() {
Vec vec = parse_ivec("12 13");
std::cout << vec.a << " " << vec.b << "\n";
}
печать
12 13
3. std::tuple<int, int>
Live On Coliru
#include <boost/fusion/adapted/std_tuple.hpp>
using Vec = std::tuple<int, int>;
#include <boost/spirit/include/qi.hpp>
namespace qi = boost::spirit::qi;
template <typename It> Vec parse_ivec(It first, It last) {
Vec v;
if (qi::phrase_parse(first, last, qi::int_ >> qi::int_ >> qi::eoi, qi::space, v))
return v;
throw std::runtime_error("Parse failed");
}
Vec parse_ivec(std::string const& r) { return parse_ivec(begin(r), end(r)); }
int main() {
Vec vec = parse_ivec("12 13");
std::cout << std::get<0>(vec) << " " << std::get<1>(vec) << "\n";
}
печать
12 13
¹ Технически, последовательность Fusion, которая может быть сделана совместимой с множеством типов, таких как std :: pair, или ваши собственные типы адаптированы.