什么是 std::function?
std::function 是 C++11 引入的一个通用函数封装器,它能容纳任何'可调用对象'。无论是普通函数、带捕获的 Lambda 表达式、函数指针、成员函数绑定(如 std::bind),还是重载了 operator() 的仿函数,它都能统一管理。
它是 <functional> 头文件中定义的模板类:
template<class R, class... Args>
class function<R(Args...)>;
这意味着 std::function<void(int)> 可以接收一个 int 参数且无返回值,背后可以是上述任意一种可调用实体。
核心应用场景
在实际开发中,std::function 主要解决以下问题:
| 场景 | 描述 |
|---|---|
| 回调机制 | 存储传入的回调函数,例如事件触发或异步完成通知 |
| 异步任务调度 | 作为任务队列中的任务封装单元 |
| 策略模式 | 运行时动态替换算法或行为策略 |
| 通用接口 | 允许用户传入任意处理逻辑,提升系统模块化程度 |
与函数指针的对比
虽然函数指针历史悠久,但 std::function 在灵活性和安全性上更有优势:
| 特性 | 函数指针 | std::function |
|---|---|---|
| 只支持普通函数 | ✅ | ❌ |
| 支持 Lambda | ❌ | ✅ |
| 支持捕获变量 | ❌ | ✅ |
| 支持成员函数 | 部分(需手动绑定) | ✅(内置 std::bind 或 Lambda 支持) |
| 类型安全与泛型 | ❌ | ✅ |
| 内存开销 | 较小 | 稍大(存在类型擦除),通常可忽略 |
基础用法示例
1. 封装函数、Lambda 与函数指针
这段代码展示了如何将不同类型的可调用对象赋值给 std::function 实例:
#include
{
std::cout << ;
}
{
a + b;
}
{
std::function<()> f1 = sayHello;
();
std::function<(, )> f2 = add;
std::cout << (, ) << ;
std::function<(, )> f3 = []( x, y) { x * y; };
std::cout << (, ) << ;
}

