ThinkSSL🔒 一键申购 5分钟快速签发 30天无理由退款 购买更放心 广告
[TOC] ## Lambda 表达式 Lambda 表达式的基本语法如下: ``` [捕获列表](参数列表) mutable(可选) 异常属性 -&gt; 返回类型 { // 函数体 } ``` ### 值捕获 ``` int value = 1; auto lam = [value]() { return value; }; value = 2; // value 改变不影响 lamdbda 表达式的值 int lam1 = lam(); std::cout << lam1; // 1 ``` ### 引用捕获 ``` int value = 1; auto lam = [&value]() { return value; }; value = 2; // value 改变影响 lamdbda 表达式的值 int lam1 = lam(); std::cout << lam1; // 2 ``` ### 隐式捕获 手动书写捕获列表有时候是非常复杂的,可以在捕获列表中写一个`&`或`=`向编译器声明采用引用捕获或者值捕获. ``` [] 空捕获列表 [name1, name2, ...] 捕获一系列变量 [&] 引用捕获, 让编译器自行推导引用列表 [=] 值捕获, 让编译器自行推导值捕获列表 ``` 引用捕获 ``` int value = 1; auto lam = [&]() { return value; }; value = 2; // value 改变影响 lamdbda 表达式的值 int lam1 = lam(); std::cout << lam1; // 2 ``` 值捕获 ``` int value = 1; auto lam = [=]() { return value; }; value = 2; // value 改变影响 lamdbda 表达式的值 int lam1 = lam(); std::cout << lam1; // 1 ``` ### 表达式捕获 可对 捕获列表的值进行获取 ``` auto lam = [v1 = 1, v2 = 2](int t )-> int { return v1 + v2+t; }; std::cout << lam(3); // 3 return 0; ``` ### 泛型 Lambda lambda 不支持模版函数,但是可通过 auto 实现 ``` auto a = [](auto x, auto y) { return x+y ; }; std::cout << a(1.1, 2.2); //3.3 ``` ### 函数对象包装器-std::function ``` #include <functional> #include <iostream> int foo(int para) { return para; } int main() { // std::function 包装了一个返回值为 int, 参数为 int 的函数 std::function<int(int)> func = foo; int important = 10; std::function<int(int)> func2 = [&](int value) -> int { return 1+value+important; }; std::cout << func(10) << std::endl; std::cout << func2(10) << std::endl; } ``` ### std::bind 和 std::placeholder 参数分多次传入 ``` #include <functional> #include <iostream> int foo(int a, int b, int c) { return a + b + c; } int main() { // 将参数1,2绑定到函数 foo 上, // 但使用 std::placeholders::_1 来对第一个参数进行占位 auto bindFoo = std::bind(foo, std::placeholders::_1, 1,2); // 这时调用 bindFoo 时,只需要提供第一个参数即可 bindFoo(1); } ```