在C ++ 11中,可以使用捕获来编写lambdas(这太棒了!)
auto myfunc = [&] (int i) {return i + j;}; // j being somewhere in the lambda's context
太棒了!但是,如果一个人可以从一个函数,甚至另一个lambda返回这样一个lambda,那将是非常好的。这有可能吗?
答案 0 :(得分:4)
在C ++ 11中,你必须将它包装在一个已知类型的函数对象中,以便从函数中返回它:
std::function<int(int)> get_lambda() {
return [&] (int i) {return i + j;};
}
在C ++ 14中,您可以使用auto
返回lambda类型本身:
auto get_lambda() {
return [&] (int i) {return i + j;};
}
在任何一种方言中,你都可以从lambda中返回它:
auto get_lambda = [&] {return [&] (int i) {return i + j;};};
请注意,您不希望返回此特定lambda,因为它捕获对局部变量j
的引用。当函数返回时,变量将被销毁,使引用无效。
答案 1 :(得分:1)
你可以return带有捕获的lambda。由于c ++ 14引入了自动返回类型,因此这一点非常简单。
以下是一个如何创建一个函数的示例,该函数将应用二元运算符(此处为乘法,但它是一个模板参数,因此您可以给它任何东西),其中一个参数在创建期间固定,第二个在致电期间提供
#include <iostream>
#include <functional>
template<typename F, typename T>
auto opby(F func, T arg)
{
return [=](auto val) {
return func(val, arg);
};
}
int main()
{
auto mu = opby(std::multiplies<int>(), 2);
std::cout << mu(3) << std::endl;
}
它打印6.返回的lambda 通过值捕获其封闭范围,因此创建了一个函数,该函数将乘以你给它的任何参数。
唯一需要注意的是capturing by reference:你必须确保关闭不会超越被捕获对象的生命周期。
答案 2 :(得分:0)
我想提供一个已接受答案的简单示例。
#include <iostream>
using namespace std;
auto get_lambda(int j) {
//capture by value here
return [=](int i) {return i + j; };
}
int main() {
auto f = get_lambda(3);
for (int i = 0; i < 1000; i++) {
cout << f(i) << endl;
}
}
这看起来就像 JavaScript 和 Python 中的闭包。哎呀!