目前我有这样的东西:
qi::_val = boost::phoenix::bind(
[](const std::string&, const boost::optional<std::string>&)
{ return std::string();
},
qi::_1,
qi::_2
)
我想选择使此规则不匹配。关于语义函数的documentation没有说明如何返回创建对象的属性。
我尝试在lambda函数中添加两个额外的参数:
const boost::fusion::unused_type&, bool&
但这行不通。
1条答案
按热度按时间ct2axkht1#
记录的签名here:
是低级,我们可以说是“原始”语义动作函数。只有当您是一个库开发人员,希望了解有关
Context
如何静态组成和动态访问的所有细节时,它们才是有趣的。上下文包含skippers、本地属性、继承属性、合成属性、绑定属性引用 * 和 * parse-result标志。
人们使用Phoenix表达式来创建具体的语义动作,而不是处理这些签名。Qi defines placeholder actors对应于上下文元素:
_1
,_2
...,_Np的第n个属性
_val
封闭规则的合成属性。
_r1
,_r2
...,_rN
封闭规则的第N个继承属性。
_a
,_b
...,_j
封闭规则的局部变量(_a指第一个)。
_pass
将false赋给_pass以强制解析器失败。
您已经选择了Phoenix(使用
phoenix::bind
)。所以我建议你还是采用Phoenix式的动作。让你的例子工作的最简单的方法:奖励/升级
但请注意,您也可以***雇用更多的高级Phoenix设施。
我个人更喜欢Phoenix改编的callables。例如,让我们编写一个功能性更强的语义动作:
它实现的验证逻辑是:如果存在第二个字符串,则它必须与第一个字符串 * 反向 * 匹配。
现在,您可以使用
phoenix::function
创建相应的actor:这意味着您可以简单地编写操作:
看到这个**Live On Coliru**
输出:
观察结果:
请注意,这样你就不需要把
bool& pass
作为参数了。相反,你可以返回bool:并将动作写为:
关于exact same results
通常,您可以利用现有的参与者(例如对于标准库函数和运算符),并且根本不使用自定义函数编写,例如匹配一个词,只有当它的长度:
看到它**Live On Coliru**
C++17甜
在C++17中,由于CTAD,可以方便地使用lambda表达式。这样就可以避免像以前一样定义
magic_f
类型:看到它**Live On Coliru**