为什么要编写一个带有名称的C++ lambda,以便可以从某个地方调用它?

use*_*921 10 lambda function c++11

为什么要编写一个带有名称的C++ lambda,以便可以从某个地方调用它?这不会打败lambda的目的吗?在那里编写函数更好吗?如果没有,为什么?功能会有任何缺点吗?

Tho*_*mas 10

使用名称的一个很好的理由是表达意图。然后可以检查 lambda 是否做了“正确的事情”,读者可以检查意图。鉴于:

std::string key;
std::map<std::string, int> v;
Run Code Online (Sandbox Code Playgroud)

可以写如下:

std::find_if( v.begin(), v.end(), [&](auto const& elem){ return elem.first == key; } );
Run Code Online (Sandbox Code Playgroud)

但很难说它是否“正确”。而如果我们把它拼出来:

auto matches_key = [&](auto const& elem){ return elem.first == key; };

std::find_if( v.begin(), v.end(), matches_key );
Run Code Online (Sandbox Code Playgroud)

更清楚的是,我们确实希望进行相等比较并且提高可读性。


Gas*_*ssa 5

一种用途是让函数访问封闭范围。

在C ++中,我们没有像其他语言一样具有嵌套函数。拥有命名的lambda可以解决此问题。一个例子:

#include <iostream>

int main ()
{
    int x;

    auto fun = [&] (int y) {
        return x + y;
    };

    std::cin >> x;

    int t;
    std::cin >> t;
    std::cout << fun (fun (t));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在这里,该函数fun基本上是中的嵌套函数main,能够访问其局部变量。我们可以对其进行格式化,使其类似于常规函数,并多次使用。


lub*_*bgr 5

在命名 lamdba 和自由函数之间进行选择时,我认为需要考虑三件事:

  1. 您需要来自周围范围的变量吗?如果是,请选择 lamdba 并利用其闭包。否则,请使用自由函数(因为 3.)。
  2. 闭包状态是否可以同样好地作为函数参数传递?如果是,请考虑首选免费函数(因为 3.)。
  3. 您想为可调用对象编写测试和/或在多个翻译单元中重用它吗?如果是,请选择一个自由函数,因为您必须在头文件中声明它并在 lamdba 闭包中捕获变量

    • 在头文件中有点混乱(当然,这是有争议的)。

    • 要求类型已知。因此,您不能通过向前声明函数参数和返回类型来减少编译时间。