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

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

【问题讨论】:

  • 你在 lambdas 上找到的任何资源都会解释如何让它们接受参数。
  • @chris 我知道 hpw 要做然后带参数 - [](int parameter) {lambda body},但我会使用这个 lambda 吗?
  • 就像一个函数。
  • @chris 我很困惑 lamdba 没有名字,下面的答案对我有帮助

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


【解决方案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,那么您可以:

  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);
    }
    

【讨论】:

    【解决方案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 ;
    

    【讨论】:

      猜你喜欢
      • 2016-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-05
      • 2016-04-10
      相关资源
      最近更新 更多