返回包含从函数捕获的 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 您将给它的任何参数。
唯一需要注意的是引用捕获时:您必须确保闭包不会超过捕获对象的生命周期。
我想提供一个接受答案的简单例子。
#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中的闭包。哗啦啦!
相关文章:
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 如何建立使用模板函数的lambda函数的尾部返回类型
- 我可以将调用类的"this"传递给 lambda 函数吗?
- 两组使用lambda函数的大括号
- 尝试将lambda函数放在队列中时出现一般分配器错误(可能是与unique_ptr有关的错误)
- 我可以在这里替换什么,因为我不能在 C# 中使用隐式变量的 lambda 函数?
- 为什么我不能在 constexpr lambda 函数中使用 std::tuple
- C++:Lambda 函数指针转换的用例是什么?
- 将 lambda 函数作为参数传递C++
- 如何将 lambda 函数作为参数发送到另一个函数
- 传递 lambda 函数的权衡是什么?
- 如何使用类模拟 C++11 中的 lambda 函数和闭包?
- 不是 lambda 函数中的常量表达式
- 如何使用可变参数数重载 lambda 函数?
- 如何通过指针传递lambda函数?
- 使用带有 lambda 函数指针的模板
- openmp c++ 中并行块内 lambda 函数的奇怪行为
- C++ 中 Lambda 函数中的溢出
- 将数组传递到 lambda 函数中
- lambda 函数未显示正确的结果