C++笔记 - lambda

106 阅读1分钟

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