1. std::function
类模板

- 是什么:是 C++11 引入的函数包装器模板,能抽象函数的参数列表和返回值,把各类可调用实体(函数、函数对象等 )“包装” 成统一类型的对象,方便存储、传递。
- 核心能力:
- 抽象与封装:不管是普通函数、lambda、仿函数,还是
bind
适配后的结果,都能被它包裹,让这些可调用体像普通对象一样存到容器、作为函数参数传递。 - 模拟多态:通过替换不同的可调用对象(赋不同
function
实例),实现类似 “函数行为多态”,运行时动态切换逻辑。
- 抽象与封装:不管是普通函数、lambda、仿函数,还是
- 典型用途:需统一管理、传递函数逻辑场景,比如回调函数注册(GUI 事件回调、网络异步回调 )、把不同函数逻辑存进
std::vector<std::function<...>>
批量执行 。
2. lambda
表达式
- 是什么:C++11 简化匿名函数对象创建的语法糖,能快速写短小、临时的函数逻辑,不用单独写 “仿函数类”。
- 构成与特性:
- 语法拆解:
[捕获列表](参数列表) -> 返回值类型 { 函数体 }
,捕获列表决定能否用、如何用外部变量(值捕获默认只读,mutable
放开修改;引用捕获直接关联外部变量 );参数、返回值、函数体和普通函数逻辑一致。 - 本质:编译时会被编译器转成匿名仿函数类(重载
operator()
),捕获的外部变量变成类成员,天然支持 “带状态的函数对象”,也叫闭包(有状态的函数对象)。
- 语法拆解:
- 典型用途:写临时、简短逻辑(算法自定义比较
sort
的排序规则 ),配合 STL 算法(for_each
遍历处理 ),或当轻量回调,不用单独定义函数 / 类。
3. bind
函数适配器
- 是什么:C++11 里
<functional>
头文件的工具(std::bind
),用于 “绑定” 函数(或函数对象)的参数,生成新的可调用对象。 - 核心能力:
- 参数绑定 / 占位:能固定函数部分参数(填具体值),剩下用
std::placeholders
(_1
、_2
… )占位,调用时再传;也能调整参数顺序。 - 生成函数对象:绑定后产出的结果是函数对象,可直接调用,或存到
std::function
,也能当参数传递。
- 参数绑定 / 占位:能固定函数部分参数(填具体值),剩下用
- 典型用途:适配已有函数参数(比如把多参数函数转成少参数,符合回调期望 ),或调整参数顺序适配接口,让函数使用更灵活。
三者关系总结
lambda
与std::function
:lambda
编译后是函数对象,可直接赋值给匹配签名的std::function
,让std::function
承载 lambda 的逻辑,实现 “用统一类型管理匿名函数”。bind
与std::function
:bind
产出的函数对象,也能存到std::function
里,用统一类型封装、传递绑定后的逻辑。lambda
与bind
:二者常配合:用bind
预处理函数参数,再用lambda
写灵活逻辑;或 lambda 里调用bind
适配的函数,组合出更复杂调用。- 统一角色:
std::function
是 “容器 / 载体”,负责类型抽象和统一管理;lambda
是 “快捷创建函数对象的语法”,轻量写临时逻辑;bind
是 “参数适配器”,调整函数调用方式。三者协作,让 C++ 处理函数式编程、回调、灵活调用更简洁高效。