C ++ 11 lambda函数-如何传递参数
Posted
技术标签:
【中文标题】C ++ 11 lambda函数-如何传递参数【英文标题】:C++11 lambda function - how to pass parameter 【发布时间】:2013-03-29 00:48:19 【问题描述】:我使用 lambda 函数将其传递给 std::condition_variable
wait() 函数,但事实并非如此。我使用不接收任何参数的 lambda 函数,对我来说一切都非常清楚。但我完全不明白如何使用具有参数列表的 lamdba 函数。使用带参数的显示 lambda?如何给它们传递参数?
【问题讨论】:
你在 lambdas 上找到的任何资源都会解释如何让它们接受参数。 @chris 我知道 hpw 要做然后带参数 - [](int parameter) lambda body,但我会使用这个 lambda 吗? 就像一个函数。 @chris 我很困惑 lamdba 没有名字,下面的答案对我有帮助 【参考方案1】:使用带参数的show lambda?如何给它们传递参数?
它与任何其他类型的可调用对象完全一样:
#include <iostream>
int main()
auto l = [] (int i) std::cout << "The answer is " << i; ;
l(42);
另请注意,您无需将 lambda 存储在变量中即可调用它。以下是重写上述程序的另一种方法:
#include <iostream>
int main()
[] (int i) std::cout << "The answer is " << i; (42);
// ^^^^
// Invoked immediately!
lambda 函数的类型(所谓的“lambda 闭包”)由编译器定义,是一个带有调用运算符的函子,其签名是您在定义 lambda 时指定的签名。因此,您调用 lambda 的方式与调用仿函数的方式完全相同(即,与调用函数或任何可调用对象的方式完全相同)。
因此,如果要将 lambda 分配给对象,最佳做法是让编译器使用 auto
推断其类型。如果您不想或不能使用auto
,那么您可以:
对非捕获 lambda 使用函数指针(捕获 lambda 不可转换为函数指针)。因此,在上述情况下,以下也将起作用:
#include <iostream>
int main()
void (*f)(int) = [] (int i) std::cout << "The answer is " << i; ;
f(42);
使用std::function
(这总是可能的,即使 lambda 正在捕获):
#include <iostream>
#include <functional>
int main()
std::function<void(int)> f = [] (int i)
std::cout << "The answer is " << i; ;
f(42);
【讨论】:
【参考方案2】:auto lambda = [] (int a, int b) return a + b; ;
assert(lambda(1, 2) == 3);
【讨论】:
啊哈!在这里自动隐藏 int(*p)(int, int)? @Littlebitter lambdas 的类型是实现定义的,因此你需要auto
。您可以将一些 lambda(不捕获任何内容)转换为函数指针,但这不是它们的实际类型(类似于您如何将 int
转换为 long
,但 int
不是 @ 987654326@).
如果 lambda 为 [] (int a, int b) -> int return a + b; ;可以使用我描述的类型创建指向函数变量的指针,而无需自动?
我很确定所有 lambda 表达式都可以存储在 std::function
中,不是吗?并且@Littlebitter,将其分配给您的第一条评论中的类型将起作用,因为它不会捕获任何内容。
是的,您可以使用int (*lambda)(int, int) = [] (int a, int b) return a + b;
,因为 lambda 不会捕获任何变量。【参考方案3】:
你甚至不需要一个变量来保存你的 lambda——你可以直接调用它:
std::cout << [](int n) return n + 1 ; (99) << std::endl ;
【讨论】:
以上是关于C ++ 11 lambda函数-如何传递参数的主要内容,如果未能解决你的问题,请参考以下文章
GridsearchCV:尝试在参数中传递 lambda 时无法腌制函数错误