[英]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.