在lambda的懒惰论点中不接受lambda

时间:2019-01-28 05:18:45

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

eps接受一个用于计算bool的惰性参数。

我一直在将eps与pheonix对象(例如eps(_r1 == 0) >> something)一起使用,并且有效。

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

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)

我在Spirit文档中看不到对惰性参数的任何限制。

如何使用非pheonix函数对象?

1 个答案:

答案 0 :(得分:1)

显示的代码无法重现您的问题(https://wandbox.org/permlink/uE5ONUXCjuX7j4Mt)。我认为您的意思是在更多情况下。

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

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

我有很多例子,但请参见boost spirit semantic action using non-void function objects