function函数
std::function 是一种通用、多态的函数封装,它的实例可以对任何可以调用的目标实体进行存储、复制和调用操作,它也是对 C++中现有的可调用实体的一种类型安全的包裹(相对来说,函数指针的调用不是类型安全的),简而言之,std::function 就是函数的容器
#include <functional>
#include <iostream>
using namespace std;
int foo(int x, int y)
{
return x+y;
}
int main()
{
//lambd函数对象
auto fl = [](int x, int y){return x + y; };
cout << fl(2, 3) << endl;
//function包装了一个返回值为int,参数为两个int类型的函数
function<int(int, int)>f2 = [](int x, int y){return x + y; };
cout << f2(3, 4) << endl;
auto f3 = foo;
cout << f3(2, 3) << endl;
//function包装了一个返回值为int,参数为两个int类型的函数
function<int(int,int)> f4 = foo;
cout << f4(3, 4) << endl;
return 0;
}
lambda 表达式
- 语法
[capture](parameters)->return-type {body}
[]叫做捕获说明符
,表示一个lambda表达式的开始。接下来是参数列表,即这个匿名的lambda函数的参数。
auto fl = [](int x,int y) -> int {return x+y;};
auto fl = [](int x, int y){return x + y; };
[]这东西就用来设置读取变量方式的
。比如当前作用域有个变量 i ,你可以选择按 [值、址] 来引用它
它有两个通配符 = 和 & 一个取值一个取址
,它有几个组合用法:
[a, &b] // a 传值,b 传址
[=, &b] // 全都传值,但是b 除外(传址)
[&, b] // 全都传址,但是b 除外(传值)
- (int x, int y) 这是形参列表
- -> int 这个 int 是返回值。如果省略则函数结果是啥类型就返啥类型。
- {函数体}
[] (int x, int y) -> int { 函数体 }
- 捕获列表
在 lambda 表达式引出操作符[ ]里的“captures”称为“捕获列表”,可以捕获表达式外部作用域的变量,在函数体内部直接使用,这是与普通函数或函数对象最大的不同
捕获列表里可以有多个捕获选项,以逗号分隔,使用了略微“新奇”的语法,规则如下
[ ] :无捕获,函数体内不能访问任何外部变量
[ =] :以值(拷贝)的方式捕获所有外部变量,函数体内可以访问,但是不能修改。
[ &] :以引用的方式捕获所有外部变量,函数体内可以访问并修改(需要当心无效的引用);
// 捕获单个值
[ var] :以值(拷贝)的方式捕获某个外部变量,函数体可以访问但不能修改。
[ &var] :以引用的方式获取某个外部变量,函数体可以访问并修改
// 设置不同的 捕获属性
[ this] :捕获this指针,可以访问类的成员变量和函数,
[ =,&var] :引用捕获变量var,其他外部变量使用值捕获。
[ &,var]:只捕获变量var,其他外部变量使用引用捕获。