我正在尝试定义递归lambda。
在其他语言中,例如GO,可以声明为:
func main() {
var f func()
f = func() { f() }
}
也许是由模板实现引起的?
#include <functional>
int main() {
std::function<int()> f;
int a = 0;
f = [f,&a]() -> int {
a++;
if (a > 2) {
return 1;
}
return f();
};
if (f() != 0) {
goto out;
}
out:
return 0;
}
这是我的编译器:
Apple LLVM version 10.0.1 (clang-1001.0.46.4)
Target: x86_64-apple-darwin18.6.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
您正在按值捕获f
。您想通过参考来捕获递归lambda。这是一个示例递归lambda:
#include <functional>
#include <iostream>
int main() {
std::function<int(int)> factorial;
factorial = [&factorial](int i) {
if (i < 2) {
return 1;
}
return i * factorial(i - 1);
};
std::cout << "5! = " << factorial(5) << 'n';
}
std::function
在大多数情况下都很好,但是如果您的递归lambda证明是性能瓶颈,那么您可以将lambda传递到自身中,并有一个额外的参数:
int a = 0;
auto f = [&a](auto&& go) -> int { //explicit return type is required here
++a;
if (a > 2) { return 1; }
return i * go(go);
};
f(f);
请注意,在lambda参数中,将lambda传递到lambda所需的 auto
至少需要C 14。