大佬教程收集整理的这篇文章主要介绍了c – 在Boost Phoenix表达式中转换函数体,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
例如,我已经构建了Boost Phoenix Starter Kit的Lazy Functions部分,并创建了一个延迟添加函数:
struct my_lazy_add_impl { typedef int result_type; template <typename T> T operator()(T x,T y) const { return x+y; } }; phoenix::function<my_lazy_add_impl> my_add;
然后我从previous question准备一个简单的加号 – 减号变换,如下所示:
struct invrt: proto::or_< proto::when< proto::plus<proto::_,proto::_>,proto::functional::make_expr<proto::tag::minus>( invrt(proto::_left),invrt(proto::_right) ) >,proto::otherwise< proto::nary_expr<proto::_,proto::vararg<invrt> > > > {};
但是,当我将一个倒置的Phoenix lambda表达式(使用my_add)应用于其参数时,如下所示,似乎尚未实现预期的反转.是否有推荐的方法在Phoenix中实现函数调用,这可以促进这种转换?
int main(int argc,char *argv[]) { auto f = phoenix::lambda(_a = 0)[my_add(_1,_2)]; auto g = invrt()(phoenix::lambda(_a = 0)[my_add(_1,_2)]); std::cout << f()(1,2) << std::endl; // 3 std::cout << g()(1,2) << std::endl; // 3 again; alas not -1 return 0; }
auto g = invrt()(phoenix::lambda(_a = 0)[my_add(_1,_2)]);
哪个是加号节点?对于Proto(和PhoeniX),my_add是不透明的.他们不知道那里有一个额外的东西.他们怎么样?
==== ====编辑
相反,请考虑这一点,这符合您的意图:
#include <iostream> #include <boost/phoenix.hpp> #include <boost/proto/proto.hpp> namespace proto = boost::proto; namespace phoenix = boost::phoenix; using namespace phoenix::arg_names; using namespace phoenix::local_names; auto const my_add = phoenix::let(_a = _1,_b = _2)[_a + _b]; struct invrt: proto::or_< proto::when< proto::plus<proto::_,proto::vararg<invrt> > > > {}; int main() { auto f = phoenix::lambda(_a = 0)[my_add(_1,_2)]); std::cout << f()(1,2) << std::endl; // -1,w00t! }
以上是大佬教程为你收集整理的c – 在Boost Phoenix表达式中转换函数体全部内容,希望文章能够帮你解决c – 在Boost Phoenix表达式中转换函数体所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。