lambda 在 boost spirit 的惰性参数中不被接受
lambda not accepted in boost spirit's lazy arguments
eps
接受计算 bool 的惰性参数。
我一直在使用 eps
和像 eps(_r1 == 0) >> something
这样的 pheonix 对象,而且它很有效。
但是,当我将 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 函数对象?
显示的代码无法重现您的问题 (https://wandbox.org/permlink/uE5ONUXCjuX7j4Mt)。我假设你的意思是在更多上下文中。
我认为 "raw function signature" 仅适用于完全匹配(不方便正确且难以维护,请参阅 boost spirit semantic action parameters)。
因此,要将任何可调用对象(您的多态 lambda 就是这样的东西)变成 Phoenix actor,请使用 phoenix::bind
。我个人喜欢使用 phoenix:function<>
来包装我的可调用对象。
我有很多这样的例子,但是请看例如boost spirit semantic action using non-void function objects
eps
接受计算 bool 的惰性参数。
我一直在使用 eps
和像 eps(_r1 == 0) >> something
这样的 pheonix 对象,而且它很有效。
但是,当我将 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 函数对象?
显示的代码无法重现您的问题 (https://wandbox.org/permlink/uE5ONUXCjuX7j4Mt)。我假设你的意思是在更多上下文中。
我认为 "raw function signature" 仅适用于完全匹配(不方便正确且难以维护,请参阅 boost spirit semantic action parameters)。
因此,要将任何可调用对象(您的多态 lambda 就是这样的东西)变成 Phoenix actor,请使用 phoenix::bind
。我个人喜欢使用 phoenix:function<>
来包装我的可调用对象。
我有很多这样的例子,但是请看例如boost spirit semantic action using non-void function objects