繁体   English   中英

返回带有函数捕获的lambda

[英]Returning a lambda with captures from a function

在C ++ 11中,可以编写带有捕获的lambda(这太棒了!)

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

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

在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的引用。 函数返回时,该变量将被破坏,从而使引用无效。

您可以返回带有捕获的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已按其捕获范围的值捕获了,因此创建了一个函数,该函数会将您将给它的任何参数乘以2。

唯一的警告是通过引用捕获时:必须确保闭包不会超出捕获对象的生存期。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM