## 今天学了什么今天学习C11的lambda表达式和function包装器。## 可调用对象概念在C中有一类对象可像函数一样调用分类①函数指针using prt void(*)(int, string);prt f1 fun;f1(1, 函数指针);②仿函数 --有 operator的类对象Person p;p(2);③可以被转换成函数指针的类对象 operator ruturn infoPerson p2;funcptr ff p2;ff(3, 转换成函数指针的类对象);④类成员 静态成员函数指针using Person_ptr void(*)(int, string);funcptr f2 Person::info;f2(4, 静态成员函数指针);⑤非静态成员函数指针using Person_ptr2 void(Person::*)(int, string);Person_ptr2 f3 Person::hello;Person a;(a.*f3)(10, 非静态成员函数指针);⑥类成员变量指针using Person_pt int Person::* ;Person_pt f4 Person::num;a.*f4 100;## function包装器头文件functional定义一个类模板可以包装任意可调用对象普通函数、静态成员、仿函数、lambda、bind结果通过指定他的模板参数可以用统一的方式处理它们并允许保存和延迟执行。优点统一类型不同种类可调用对象包装后变成同一种 function 类型可存储保存可调用对象延后执行可放进容器方便回调可作为函数参数传递回调场景首选调用接口统一都用调用不用关心底层是什么注空function调用会抛异常。语法function返回值类型(参数类型列表)使用方法①包装普通函数functionvoid(int, string) f1 printTest;f1(1, 包装的普通函数调用);②包装类的静态函数functionvoid(int, string) f2 Person::info;f2(2, 包装类的静态函数调用);③包装仿函数Person p;functionvoid(int, string) f3 p;f3(3, 包装的仿函数调用);④包装转换为函数指针的对象Person p2;ptr mptr p2;functionvoid(int, string) f4 mptr;f4(4, 转换为函数指针的对象);## 绑定器定义将可调用对象与其他参数一起进行绑定。作用将可调用对象与其他参数一起进行绑定成为一个仿函数将多元可调用对象转换成一元或者n-1元可调用对象。语法分类①绑定非类成员/静态类成员;bind(printTest, 1, placeholders::_1)(绑定非类成员);//placeholders::_1 占位符 传入的第一个参数②绑定非静态类成员Person t;bind(Person::hello, t, 2, placeholders::_1)(绑定类成员);注绑定了固定的数字后续传进的参数将不会生效。## lambda表达式特点匿名对象不需要写函数名和函数对象简洁避免了代码膨胀可功能分散让开发更高效在需要的时间和地点实现功能闭包使程序更灵活。语法[ ]选项 返回值 { } ; //选项 返回值一般不写常用捕获列表Ⅰ. [ ] 不捕捉任何变量Ⅱ. [ ]值拷贝方式捕获Ⅲ. [ ]引用方式捕获Ⅳ. [ a ]混用方式捕获 除了a 用引用其他都是值拷贝方式捕获参数列表如果没有参数可以不写但最好写上 [ ] { ... }选项mutable修改数据的只读状态为读写状态exception抛出异常。## 包装器和绑定器结合使用绑定器返回值是一个仿函数包装器可接收绑定器的返回值。#includeiostream using namespace std; #includefunctional void output_add(int x, int y) { cout x: x y: y xy x y endl; } void testFunc(int x, int y, functionvoid(int, int) f) { if (x % 2 0) { f(x , y); } } int main() { for (int i 0; i 5; i) { functionvoid(int,int) fbind(output_add, i 1, i 5); testFunc(i, i, f); functionvoid(int, int) f2 bind(output_add, placeholders::_1, placeholders::_1); testFunc(i, i, f2); } return 0; }