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

Posted

技术标签:

【中文标题】C ++ 11 lambda函数-如何传递参数【英文标题】:C++11 lambda function - how to pass parameter 【发布时间】:2013-03-29 00:48:19 【问题描述】:

我使用 lambda 函数将其传递给 std::condition_variablewait() 函数,但事实并非如此。我使用不接收任何参数的 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函数-如何传递参数的主要内容,如果未能解决你的问题,请参考以下文章

将 lambda 作为模板函数参数传递

在 C++11 中传递具有未指定参数的函数?

如何传递和使用任意lambda函数作为参数[重复]

GridsearchCV:尝试在参数中传递 lambda 时无法腌制函数错误

python tkinter, 通过lambda表达式传递参数到按钮的点击事件函数

将 lambda 作为参数传递 - 通过引用或值?