C++11新特性:Lambda表达式
标准C++库提供了诸如find
, sort
的工具函数,它们的Compare
模板参数是一个典型的谓词函数。
但C++的函数中虽然可以定义内部类,但无法定义内部类模板,因此这个过程会比较麻烦。
为此C++11提供了Lambda表达式来简化谓词函数的定义和传递。
一个简单的Lambda函数是这样定义的:
[](int x, int y) -> int { return x + y; }
// 返回值可由 decltype(x + y) 推导出来,因此可以省略返回值声明
[](int x, int y) {return x+y; }
在Lambda表达式内可以访问当前作用域的变量,这是Lambda表达式的闭包(Closure)行为。
与JavaScript闭包不同,C++变量传递有传值和传引用的区别。可以通过前面的[]
来指定:
[] // 不传递任何变量
[x, &y] // x传值,y传引用
[&] // 引用方式传递所有用到的变量
[=] // 传值方式传递所有用到的变量
[&, x] // x传值,其他所有用到的变量传引用
[=, &z] // z传引用,其他所有用到的变量传值
如果使用
[&]
或是[=]
的形式,this
在lambda函数可见。
例如用for_each
和Lambda表达式来实现accumulate
的功能:
std::vector<int> someList;
int total = 0;
std::for_each(someList.begin(), someList.end(), [&total](int x) { total += x; });
std::cout << total;
来一个传值和传引用混用的例子:
int total = 0;
int value = 5;
[&, value](int x) { total += (x * value); };
还可以把Lambda表达式存到一个变量里:
auto myLambdaFunc = [this]() { this->SomePrivateMemberFunction(); };
auto myOnheapLambdaFunc = new auto([=] { /*...*/ });
本文采用 知识共享署名 4.0 国际许可协议(CC-BY 4.0)进行许可,转载注明来源即可: https://harttle.land/2015/10/09/cpp11-lambda.html。如有疏漏、谬误、侵权请通过评论或 邮件 指出。