gpt4 book ai didi

c++ - 在 Boost Phoenix 表达式中转换函数体

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:40:22 24 4
gpt4 key购买 nike

如何在 Boost Phoenix 表达式的转换中也包含函数体?

例如,我在 Boost Phoenix Starter Kit 的惰性函数部分构建了,并创建了一个惰性加法函数:

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> >
>
>
{};

但是,当我使用 my_add 将反转的 Phoenix lambda 表达式应用于其参数时,如下所示,似乎没有实现预期的反转。是否有推荐的方法在 Phoenix 中实现函数调用,以 boost 此类转换?

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::_>,
proto::functional::make_expr<proto::tag::minus>(
invrt(proto::_left), invrt(proto::_right)
)
>,
proto::otherwise<
proto::nary_expr<proto::_, proto::vararg<invrt> >
>
>
{};

int main()
{
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; // -1, w00t!
}

关于c++ - 在 Boost Phoenix 表达式中转换函数体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15224997/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com