Следующий тестовый пример - сокращение большого многофайлового парсера, отсюда и несколько странный порядок объявлений и определений. Он не компилируется, и я понимаю, что std::tuple
отключает его. Из документации мне кажется, что в синтезированном атрибуте должен присутствовать std :: tuple, если присутствуют правильные включения. Что я делаю не так?
// -*- mode: c++; -*-
#include <iostream>
#include <tuple>
#include <boost/fusion/include/io.hpp>
#include <boost/fusion/include/adapt_struct.hpp>
#include <boost/fusion/include/std_tuple.hpp>
#include <boost/fusion/adapted/std_tuple.hpp>
#include <boost/spirit/home/x3.hpp>
namespace x3 = boost::spirit::x3;
#include <boost/spirit/include/support_istream_iterator.hpp>
namespace ast {
struct S {
std::tuple< int, int > t;
int i;
};
using boost::fusion::operator<<;
} // namespace ast
BOOST_FUSION_ADAPT_STRUCT (ast::S, t, i)
namespace parser {
using S_type = x3::rule< struct S_class, ast::S >;
BOOST_SPIRIT_DECLARE(S_type)
struct S_class;
const S_type S = "S";
using x3::int_;
const auto S_def = ( int_ >> int_ ) >> int_;
BOOST_SPIRIT_DEFINE(S)
struct S_class { };
} // namespace parser
template< typename Iterator >
bool parse (Iterator& iter, Iterator last, ast::S& s) {
using x3::ascii::space;
#if 1
return x3::phrase_parse (iter, last, parser::S, space, s);
#else
return x3::parse (iter, last, ( x3::int_ >> x3::int_ ) >> x3::int_, s);
#endif // 0
}
int main () {
const std::string s = "1 2 3";
auto iter = s.begin ();
ast::S obj;
return !parse (iter, s.end (), obj);
}
Спасибо большое.