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)
更清楚的是,我们确实希望进行相等比较并且提高可读性。
一种用途是让函数访问封闭范围。
在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,能够访问其局部变量。我们可以对其进行格式化,使其类似于常规函数,并多次使用。
在命名 lamdba 和自由函数之间进行选择时,我认为需要考虑三件事:
您想为可调用对象编写测试和/或在多个翻译单元中重用它吗?如果是,请选择一个自由函数,因为您必须在头文件中声明它并在 lamdba 闭包中捕获变量
在头文件中有点混乱(当然,这是有争议的)。
要求类型已知。因此,您不能通过向前声明函数参数和返回类型来减少编译时间。