返回带有函数捕获的lambda

时间:2014-12-17 15:25:54

标签: c++ function c++11 lambda

在C ++ 11中,可以使用捕获来编写lambdas(这太棒了!)

auto myfunc = [&] (int i) {return i + j;}; // j being somewhere in the lambda's context

太棒了!但是,如果一个人可以从一个函数,甚至另一个lambda返回这样一个lambda,那将是非常好的。这有可能吗?

3 个答案:

答案 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 中的闭包。哎呀!