Spirit X3 с поддержкой boost :: string_ref из семантического действия

Я запутался с Boost Spirit X3 и классом string_ref. Как построить объект string_ref. Консоль печатает примерно так:

N5boost16basic_string_refIcSt11char_traitsIcEEE / N5boost14iterator_rangeIN9__gnu_cxx17__normal_iteratorIPcNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEE

Я не знаю, как перевести его на «нормальное имя типа», но мне кажется, что мне нужно создать string_ref из диапазона итераторов повышения?

 auto f = [](auto& ctx)
{
auto val  = _val(ctx);
auto attr = _attr(ctx);

std::cout << typeid(val).name() << " / " << typeid(attr).name() << "\n";
// _val(ctx) = boost::string_ref( attr.c_str(), 1 ); //phx::construct<boost::string_ref>( _where(ctx).begin(), _attr(ctx).size() );
};

И правило таково:

  auto const quote  = rule<struct quote, Type>{"quote"}
=    lit('"')
>> raw[*~char_('"')][ f ]
>> lit('"');

1

Решение

После комментария от cv_and_he Я использую следующую лямбду в качестве семантического действия

auto f = [](auto& ctx)
{
auto& attr = _attr(ctx);
_val(ctx) = boost::string_ref( &attr[0], attr.size() );
};
2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector