我使用 lambda 函数将其传递给std::condition_variable
wait() 函数,但事实并非如此。我使用不接收任何参数的 lambda 函数,对我来说一切都非常清楚。但我完全不明白如何使用具有参数列表的 lamdba 函数。使用带参数的显示 lambda?如何向它们传递参数?
问问题
25310 次
3 回答
33
使用带参数的显示 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); }
于 2013-04-06T17:08:54.883 回答
5
auto lambda = [] (int a, int b) { return a + b; };
assert(lambda(1, 2) == 3);
于 2013-04-06T17:08:27.080 回答
1
你甚至不需要一个变量来保存你的 lambda——你可以直接调用它:
std::cout << [](int n) { return n + 1 ; } (99) << std::endl ;
于 2013-04-06T17:17:04.510 回答