gpt4 book ai didi

c++ - 如何实现创建递归 lambda 并返回它的方法

转载 作者:行者123 更新时间:2023-12-04 16:36:40 25 4
gpt4 key购买 nike

我找到了一篇关于如何 create a recursive lambda 的帖子, 但不清楚如何从函数返回它。

据我所知,在下面的代码中,捕获了 func引用一个被销毁的对象:

#include <iostream>
#include <functional>

std::function<int (int)> make_lambda()
{
std::function<int (int)> func;

func = [&func](int val)
{
if (val < 10)
{
return func(val + 1);
}

return val;
};

return func;
}

int main()
{
std::cout << make_lambda()(0);

return 0;
}

如何使这段代码工作?

有没有比使用 std::shared_pointer<std::function<int (int)>> 更好的方法? ?

void make_lambda(std::function<int (int)>&)不是一个选项。

编辑 1:

为什么没有this允许 lambda 引用自己?

最佳答案

Y 组合器是您的 friend 。

template<class R, class...Args>
auto Y = [] (auto f) {
auto action = [=] (auto action) -> std::function<R(Args...)> {
return [=] (Args&&... args)->R {
return f( action(action), std::forward<Args>(args)... );
};
};
return action(action);
};

现在只是:

return Y<int, int>([](auto&& self, int val)
{
if (val < 10)
{
return self(val + 1);
}

return val;
});

噗,魔法。

您不能在 lambda 中使用 this 来引用 lambda 本身,因为它引用封闭对象 this

显式的this 参数提议可以让您避免这个问题。但这不在 中.

我最后检查了一下,语法看起来有点像:

return [](this auto&& self, int val) {
if (val < 10)
return self(val+1);
return val;
};

您的 *this 参数作为第一个参数传递,包括它的 r/lvalue 类别。

关于c++ - 如何实现创建递归 lambda 并返回它的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69037985/

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