
在C++11中,std::function 是一个通用的可调用对象包装器,可以存储、复制和调用任何可调用的目标,比如函数、lambda表达式、函数对象(仿函数)以及绑定表达式。它定义在 functional 头文件中,为统一处理不同类型的可调用实体提供了便利。
包含头文件并声明 std::function
使用 std::function 前需要包含对应的头文件:
#include
其模板参数指定目标可调用对象的函数类型,格式类似于函数指针:
std::function
例如,声明一个接受两个 int 并返回 int 的函数对象:
立即学习“C++免费学习笔记(深入)”;
std::function func;
存储普通函数
可以将普通函数赋值给 std::function:
int add(int a, int b) { return a + b; }
std::function func = add;
int result = func(2, 3); // result = 5
存储 Lambda 表达式
lambda 是最常与 std::function 配合使用的可调用对象之一:
std::function square = [](int x) { return x * x; }; int val = square(4); // val = 16
注意:捕获列表中的变量会被 lambda 内部持有,只要 std::function 持有该 lambda,这些状态就会被保留。
存储函数对象(仿函数)
自定义的函数对象也可以被存储:
struct Multiply { int operator()(int a, int b) const { return a * b; } };
std::function func = Multiply();
int res = func(3, 4); // res = 12
用于回调或事件处理
std::function 常用于实现回调机制,比如封装一个事件处理器:
#include #include iostream>
void triggerEvent(std::function callback) {
std::cout callback();
}
// 使用
triggerEvent([]{ std::cout
这种方式让接口更灵活,支持多种实现方式传入。
注意事项
性能开销:相比直接调用函数,std::function 存在一定的运行时开销,因为它内部使用类型擦除技术。空状态检查:未初始化或赋值为空的 std::function 调用会抛出 std::bad_function_call 异常,建议调用前判断是否有效:if (func) func(1, 2);不能比较相等性:无法通过 == 或 != 判断两个 std::function 是否包装了同一个目标。
基本上就这些。std::function 提供了一种类型安全且统一的方式来管理各种可调用对象,是现代 C++ 回调设计的核心工具之一。
以上就是C++11如何使用std::function存储可调用对象的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1475264.html
微信扫一扫
支付宝扫一扫