gpt4 book ai didi

c++ - 调用 lambda 而不将其绑定(bind)到标识符

转载 作者:可可西里 更新时间:2023-11-01 18:28:28 27 4
gpt4 key购买 nike

浏览一些互联网板我遇到了这个小挑战:

"Implement a recursive anonymous function in your favorite language"

显然这很容易使用 std::function/函数指针。

我真正感兴趣的是,如果不将 lambda 绑定(bind)到标识符,这是否可行?

类似于(忽略明显的无限递归):

[](){ this(); }();

最佳答案

当然,在 C++ 中,要调用任何 函数,您必须将它绑定(bind)到某处的标识符,这仅仅是由于语法限制。但是,如果您接受充分未命名的参数,则可以在 C++ 中创建一个版本的 y 组合器,它可以很好地递归而无需“命名”。

现在,这真的很难看,因为我不知道如何做 typedef for a recursive lambda .所以它只是使用了很多 Actor 滥用。但是,它可以工作,并打印 FLY!! 直到由于堆栈溢出而出现段错误。

#include <iostream>

typedef void(*f0)();
typedef void(*f)(f0);

int main() {
[](f x) {
x((f0)x);
} ([](f0 x) {
std::cout<<"FLY!!\n";
((f)x)(x);
});
}

这两个 lambda 是未命名的,因为它们都没有明确指定给任何地方命名。第二个 lambda 才是真正的主力,它基本上通过使用第一个 lambda 以参数的形式获取对自身的引用来调用自身。

以下是您将如何使用它来做一些“有用”的工作:

#include <iostream>

typedef int param_t;
typedef int ret_t;

typedef void(*f0)();
typedef ret_t(*f)(f0, param_t);

int main() {
/* Compute factorial recursively */
std::cout << [](f x, param_t y) {
return x((f0)x, y);
} ([](f0 x, param_t y) {
if(y == 0)
return 1;
return y*((f)x)(x, y-1);
}, 10) << std::endl;
}

关于c++ - 调用 lambda 而不将其绑定(bind)到标识符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15345020/

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