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

C++11 lambda function - how to pass parameter

本文关键字:何传递 参数 函数 lambda c++      更新时间:2023-10-16

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

是否使用带参数的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,那么您可以:
  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);
    }
    
auto lambda = [] (int a, int b) { return a + b; };
assert(lambda(1, 2) == 3);

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

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