C ++ 11 lambda函数 - 如何传递参数

时间:2013-04-06 17:05:49

标签: c++ c++11 lambda functional-programming

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

3 个答案:

答案 0 :(得分:31)

  

使用带参数的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. 使用函数指针进行非捕获lambdas(捕获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);
    }
    

答案 1 :(得分:4)

auto lambda = [] (int a, int b) { return a + b; };
assert(lambda(1, 2) == 3);

答案 2 :(得分:1)

你甚至不需要一个变量来保存你的lambda - 你可以直接调用它:

std::cout << [](int n) { return n + 1 ; } (99) << std::endl ;