c++ - 提升灵弦属性兼容性

标签 c++ boost-spirit

标题可能表达得不是很好。请评论正确的技术术语。

今天我注意到以下几点。给定

const std::string in( "QWERT" );
std::string out;

boost::spirit::qi::parse( in.begin(), in.end(),
    +boost::spirit::qi::char_, out );

boost::spirit::qi::parse( in.begin(), in.end(),
    +boost::spirit::qi::char_[ boost::phoenix::ref( out ) =
        boost::spirit::_1 ] );

boost::spirit::qi::parse( in.begin(), in.end(),
    boost::spirit::as_string[ +boost::spirit::qi::char_ ]
        [ boost::phoenix::ref( out ) = boost::spirit::_1 ] );

第一个 parse 按预期将字符串 QWERT 提取到 out 中。第二个只产生字符串 T

我假设生成的 phoenix 函数在 char_ 的每次匹配(即每个字符)上被调用,这意味着对 out 的五个赋值,最后一个是 T

这是预期的行为吗? (请指出 boost 文档中的相关部分。)

目前(我在语法中使用它作为规则)我通过第三个 parse 中的表达式修复了这个问题,这看起来有点尴尬。

最佳答案

这是由于 C++ operator precedence 引起的预期行为.您的第二个语法被评估为:

+ ( boost::spirit::qi::char_[ boost::phoenix::ref( out ) = boost::spirit::_1 ] )

你所期待的是:

(+boost::spirit::qi::char_)[ boost::phoenix::ref( out ) = boost::spirit::_1 ]

第二行实际上不起作用,因为 (+boost::spirit::qi::char_) 的类型是 std::vector<char> ,因此您需要将该 vector 转换为字符串,就像您的第三个语法一样。

关于c++ - 提升灵弦属性兼容性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16742475/

相关文章:

C++ 即使在游戏中也能捕获键盘特定键

c++ - is_regular_file 之后我有什么保证?

安卓opencv。特征检测器。实现检测

c++ - boost::spirit::qi - 这个十六进制解析有什么问题?

c++ - 从用户读取字符串

c++ - "static property"和静态常量值有什么区别?

Boost::spirit 序列未得到解析

c++ - 如何解析后跟分号或换行符的条目(boost::spirit)?

c++ - Boost spirit x3 解析为结构,如果它为空则跳过成员

c++ - boost::spirit 绑定(bind)函数提供参数作为 spirit:qi::_val