22

我使用 lambda 函数将其传递给std::condition_variablewait() 函数,但事实并非如此。我使用不接收任何参数的 lambda 函数,对我来说一切都非常清楚。但我完全不明白如何使用具有参数列表的 lamdba 函数。使用带参数的显示 lambda?如何向它们传递参数?

4

3 回答 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,那么您可以:

  1. 对非捕获 lambda 使用函数指针(捕获 lambda不能转换为函数指针)。因此,在上述情况下,以下内容也将起作用:

    #include <iostream>
    
    int main()
    {
        void (*f)(int) = [] (int i) { std::cout << "The answer is " << i; };
        f(42);
    }
    
  2. 使用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 回答