lambda 注意事项

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

如果觉得有帮助,可以扫描右边的微信打赏码支持一下.

Leave a Reply

Your email address will not be published. Required fields are marked *