在C++中,lambda函数是匿名函数。没有具体的名字的好处是:不会污染命名空间,函数像变量一样使用。函数的写法如下:
auto a_alias = [capture](parameters) -> return_type { ... };
- a_alias:保存匿名函数地址的变量
- captrue:捕获列表。
- [=] : 按照值传递的方法捕捉
- [&] : 按照引用传递的方法捕捉
- [var1, &var2] 或 [&var] 或 [var] : 捕获特定变量,按值/引用传递
- parameters: 参数列表
- return_type: 返回值类型
下面看一个例子:
#include <iostream>
#include <cassert>
int main(void) {
int i = 1;
auto add = [i](int a) -> int {
return a + i;
};
auto sub = [=](int a) -> int {
return a - i;
};
auto get_add = [&](void) -> decltype(add) {
return add;
};
auto get_sub = [&sub](void) -> decltype(sub) {
return sub;
};
assert(get_add()(1) == 2);
assert(get_sub()(1) == 0);
}
下面是一个实现递归的例子:
#include <cassert>
#include <functional>
#include <iostream>
int main(void) {
const int i = 5;
std::function<int(int, int)> fold = [i, &fold](int o, int count) -> int {
if (count > i)
return o;
return fold(o + count, count + 1);
};
assert(fold(0, 0) == 1 + 2 + 3 + 4 + 5);
}