精神X3与语义动作的boost :: string_ref构造

时间:2016-02-24 12:36:22

标签: c++ boost boost-spirit-x3

我与boost Spirit X3和string_ref类混淆了。如何构造string_ref对象。控制台打印出这样的想法:

N5boost16basic_string_refIcSt11char_traitsIcEEE / N5boost14iterator_rangeIN9__gnu_cxx17__normal_iteratorIPcNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEE

我不知道如何将其翻译为“普通类型名称”,但在我看来,我需要从boost迭代器范围创建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 个答案:

答案 0 :(得分:2)

来自cv_and_he的评论之后我使用以下lambda作为语义行为

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