【问题标题】:lambda not accepted in boost spirit's lazy arguments升压精神的懒惰论点不接受 lambda
【发布时间】:2019-01-28 05:18:44
【问题描述】:

eps 接受计算布尔值的惰性参数。

我一直在将epseps(_r1 == 0) >> something 之类的 pheonix 对象一起使用,并且效果很好。

但是,当我将 lambda 函数用于无法以 phoonix 形式表达的更复杂的表达式时,会引发静态断言并且无法编译。

auto test_lazy_arg_f = [](const auto&, const auto& context) {
  return true;
}

boost::spirit::qi::eps(test_lazy_arg_f) >> whatever_i_need;

编译失败,出现以下错误:

/usr/include/boost/spirit/home/qi/nonterminal/rule.hpp:177:13: error: static assertion failed: error_invalid_expression
         BOOST_SPIRIT_ASSERT_MATCH(qi::domain, Expr);

https://wandbox.org/permlink/eiM6zDfyzuapcQtB(感谢 Nikita Kniazev)

我没有看到精神文档中对惰性参数的任何限制。

如何使用非 pheonix 函数对象?

【问题讨论】:

  • 有趣的是,Lazy Argument 文档中提到了纯函数,但实际上它从未支持过。
  • @NikitaKniazev 啊。这也符合我的经验。我认为它只是从描述语义动作的部分中逐字复制了一点,这确实在许多方面以非常相似的方式评估表达式主要是上下文。

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


【解决方案1】:

显示的代码无法重现您的问题 (https://wandbox.org/permlink/uE5ONUXCjuX7j4Mt)。我假设你的意思是在更多的上下文中。

我认为“原始函数签名”仅适用于完全匹配(不方便正确且难以维护,请参阅 boost spirit semantic action parameters)。

因此,要将任何可调用对象(您的多态 lambda 就是这样一个东西)制作成 Phoenix actor,请使用 phoenix::bind。我个人喜欢使用phoenix:function<> 来包装我的可调用对象。

我有很多这样的例子,但请参阅例如boost spirit semantic action using non-void function objects

【讨论】:

  • 要达到这个断言,您需要parse 调用或将解析器分配给规则wandbox.org/permlink/eiM6zDfyzuapcQtB
  • @NikitaKniazev 谢谢。调用 parse 时会引发实际断言。我已经编辑了帖子。
  • @NikitaKniazev 我知道了,谢谢。我认为将来您可以将其添加到问题中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-10
  • 1970-01-01
  • 2013-11-16
  • 1970-01-01
  • 2015-09-06
  • 1970-01-01
  • 2015-08-24
相关资源
最近更新 更多