Действительно ли необходимо обертывать структуры / классы с помощью Boost.Fusion, чтобы использовать их с Boost.Spirit V2.x (особенно Boost.Spirit.Qi)? Я бы предпочел использовать семантические действия для назначения членам. Если моя память мне не помешает, то так было в V1.x ...
Пример калькулятора предполагает, что это все еще возможно. Пока что я не нашел хорошего способа сделать это.
Я бы хотел посмотреть, как вы это сделаете на примере сотрудник . Следующее не компилируется, но, возможно, есть какой-то способ заставить его работать:
template <typename Iterator>
struct employee_parser : qi::grammar<Iterator, employee(), ascii::space_type>
{
employee_parser() : employee_parser::base_type(start)
{
using qi::int_;
using qi::lit;
using qi::double_;
using qi::lexeme;
using ascii::char_;
quoted_string %= lexeme['"' >> +(char_ - '"') >> '"'];
start =
lit("employee")
>> '{'
>> int_[px::bind(&employee::age, qi::_val) = qi::_1] >> ','
>> quoted_string[px::bind(&employee::surname, qi::_val) = qi::_1] >> ','
>> quoted_string[px::bind(&employee::forename, qi::_val) = qi::_1] >> ','
>> double_[px::bind(&employee::salary, qi::_val) = qi::_1]
>> '}'
;
}
qi::rule<Iterator, std::string(), ascii::space_type> quoted_string;
qi::rule<Iterator, employee(), ascii::space_type> start;
};