
在C++11中,std::function 是一个通用的可调用对象包装器,可以存储、复制和调用任何可调用的目标,比如函数、lambda表达式、函数对象(仿函数)以及绑定表达式。它定义在 functional 头文件中,为统一处理不同类型的可调用实体提供了便利。
包含头文件并声明 std::function
使用 std::function 前需要包含对应的头文件:
#include其模板参数指定目标可调用对象的函数类型,格式类似于函数指针:
std::function例如,声明一个接受两个 int 并返回 int 的函数对象:
立即学习“C++免费学习笔记(深入)”;
std::function存储普通函数
可以将普通函数赋值给 std::function:
int add(int a, int b) { return a + b; }std::function
int result = func(2, 3); // result = 5
存储 Lambda 表达式
lambda 是最常与 std::function 配合使用的可调用对象之一:
std::function注意:捕获列表中的变量会被 lambda 内部持有,只要 std::function 持有该 lambda,这些状态就会被保留。
存储函数对象(仿函数)
自定义的函数对象也可以被存储:
struct Multiply { int operator()(int a, int b) const { return a * b; } };std::function
int res = func(3, 4); // res = 12
用于回调或事件处理
std::function 常用于实现回调机制,比如封装一个事件处理器:
#includevoid triggerEvent(std::function
std::cout
callback();
}
// 使用
triggerEvent([]{ std::cout
这种方式让接口更灵活,支持多种实现方式传入。
注意事项
- 性能开销:相比直接调用函数,std::function 存在一定的运行时开销,因为它内部使用类型擦除技术。
- 空状态检查:未初始化或赋值为空的 std::function 调用会抛出 std::bad_function_call 异常,建议调用前判断是否有效:
- 不能比较相等性:无法通过 == 或 != 判断两个 std::function 是否包装了同一个目标。
基本上就这些。std::function 提供了一种类型安全且统一的方式来管理各种可调用对象,是现代 C++ 回调设计的核心工具之一。










