在C++11中,std::function 是一个通用的可调用对象包装器,可以存储、复制和调用任何可调用的目标,比如函数、lambda表达式、函数对象(仿函数)以及绑定表达式。它定义在 functional 头文件中,为统一处理不同类型的可调用实体提供了便利。
包含头文件并声明 std::function使用 std::function 前需要包含对应的头文件:
#include <functional>其模板参数指定目标可调用对象的函数类型,格式类似于函数指针:
std::function<返回类型(参数类型...)>例如,声明一个接受两个 int 并返回 int 的函数对象:
std::function<int(int, int)> func;存储普通函数可以将普通函数赋值给 std::function:
int add(int a, int b) { return a + b; }std::function<int(int, int)> func = add;
int result = func(2, 3); // result = 5
lambda 是最常与 std::function 配合使用的可调用对象之一:

博客文章AI生成器


注意:捕获列表中的变量会被 lambda 内部持有,只要 std::function 持有该 lambda,这些状态就会被保留。
存储函数对象(仿函数)自定义的函数对象也可以被存储:
struct Multiply { int operator()(int a, int b) const { return a * b; } };std::function<int(int, int)> func = Multiply();
int res = func(3, 4); // res = 12
std::function 常用于实现回调机制,比如封装一个事件处理器:
#include <functional> #include <iostream>void triggerEvent(std::function<void()> callback) {
std::cout << "事件触发中...\n";
callback();
}
// 使用
triggerEvent([]{ std::cout << "执行回调!\n"; });
这种方式让接口更灵活,支持多种实现方式传入。
注意事项- 性能开销:相比直接调用函数,std::function 存在一定的运行时开销,因为它内部使用类型擦除技术。
- 空状态检查:未初始化或赋值为空的 std::function 调用会抛出 std::bad_function_call 异常,建议调用前判断是否有效:
- 不能比较相等性:无法通过 == 或 != 判断两个 std::function 是否包装了同一个目标。
基本上就这些。std::function 提供了一种类型安全且统一的方式来管理各种可调用对象,是现代 C++ 回调设计的核心工具之一。
以上就是C++11如何使用std::function存储可调用对象的详细内容,更多请关注知识资源分享宝库其它相关文章!
相关标签: 处理器 工具 c++ ios if 封装 include const int void Lambda 指针 接口 Struct operator function 对象 事件 大家都在看: C++中深拷贝和浅拷贝在内存管理上的区别是什么 C++如何开发学生信息管理系统 C++异常处理与标准库算法结合 C++如何在函数中抛出异常 C++CPU缓存对齐与数据结构优化
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。