0

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

我一直在使用epspheonix 对象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)

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

如何使用非 pheonix 函数对象?

4

1 回答 1

1

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

我认为“原始函数签名”仅适用于完全匹配(不方便正确且难以维护,请参阅提升精神语义动作参数)。

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

我有很多这样的例子,但请参见使用非空函数对象增强精神语义动作

于 2019-01-28T12:29:57.193 回答