
一、为什么需要function普通函数Lambda仿函数类成员函数都能直接调用但遇到两种情况原生写法会很麻烦统一管理想把不同类型的可调用对象比如普通加法函数、Lambda求模放到同一个容器里统一处理回调机制需要把函数当成参数传给另一个组件延迟到某个时机再调用function 就是C11给出的解决方案它是一个通用可调用对象包装器只要参数和返回值匹配不管是什么类型都能封装成统一类型方便存储传递和调用通俗类比function就是万能遥控器不同的品牌的家电普通函数、Lambda、仿函数...本来遥控器不通用空调遥控器只能开空调电视遥控器只能开电视而function就是万能遥控器只要家电符合【参数返回值】的适配规则都能绑定到这个遥控器上之后统一按按钮调用即可二、基础语法核心记住类型声明规则即可// 语法格式std::function 返回值类型 ( 参数1类型参数2类型...) 变量名;尖货号里的规则很好记最前面是返回值类型括号里写所有参数的类型多个用逗号分隔举个列子//声明可以装【接受两个int的参数返回int】的任意可调用对象 std::functionint(int, int) func;三、实战常见的场景不管包装什么类型用法都完全一致声明类型-赋值可调用对象-像普通函数一样调用场景1包装普通函数#include iostream #include function // 普通加法函数符合【接受2个int返回int】的规则 int add(int x, int y){ return xy; } int main(){ //1、声明function类型适配 2个int参数、返回int的可调用对象 std::functionint(int,int) func; //2、把普通函数赋值给function func add; //3、像普通函数一样调用结果和原函数完全一致 int ans func(3,2); std::cout ans std::endl;//输出5 return 0; }场景2包装lambda表达式Lambda本身是匿名的用std::function 包装后就能存储传递了#include iostream #include function int main(){ //Lambda求模符合【2个int参数返回int】直接赋值 std::functionint(int,int) fun [](int a, int b){ return a % b; } std::cout fun(7,3) std::endl;//输出1 return 0; }场景3包装仿函数仿函数重载了 () 运算符的类同样可以直接包装#include iostream #include function //仿函数减法运算 struct Sub{ int operator()(int a, int b){ return a - b; } }; int main(){ Sub sub;//先实例化仿函数对象 std::functionint(int, int) fun sub; std::cout 5 - 2 fun(5,2) std::endl;//输出1 return 0; }