简单的回调函数理解

devtools/2025/2/7 5:38:08/

使用两个脚本简单理解回调函数。简单来说,将函数B当做另一个函数A的参数进行调用。

Demo1

使用当前通用的std::function<>形式和std::bind形式。

#include <iostream>
#include <functional> // 包含 std::function 和 std::bindusing namespace std;// 普通函数
void myCallbackFunction(int value, string name)
{cout << "Callback called with value: " << value << ", name: " << name << endl;
}// 执行函数
void executeCallback(std::function<void(int, string)> callback, int data, string name)
{cout << "Executing callback..." << endl;callback(data, name); // 调用回调
}int main()
{string name = "tao";int value = 42;// std::function<void(int, string)> 通用的函数包装器类型// std::function<void(int, string)> 函数适配器, 将函数与部分参数绑定起来,生成一个新的可调用对象// std::placeholders::_1 是占位符,表示在调用 callback 时,第一个参数将被动态传递; 可以先占位, 也可以直接传递// std::function<void(int, string)> callback = std::bind(myCallbackFunction, std::placeholders::_1, std::placeholders::_2);std::function<void(int, string)> callback = std::bind(myCallbackFunction, value, name);executeCallback(callback, value, name);// 方法二:直接传递普通函数executeCallback(myCallbackFunction, 42, name);return 0;
}

Demo2

添加线程执行。

#include <iostream>
#include <functional>
#include <thread>
#include <chrono> // 模拟延时
#include <string>using namespace std;
// 总体来说, 进行解耦合,将回调函数作为参数传递给需要的地方,而作为回调函数的本身可以有无数个功能不同的函数, 更加的灵活// 普通回调函数
void myCallbackFunction(int value, string name)
{cout << "Callback executed: value = " << value << ", name = " << name << endl;
}// 模拟异步操作
void asyncOperation(std::function<void(int, string)> callback, int data, string name)
{cout << "Starting async operation..." << endl;// 模拟耗时操作(例如网络请求、文件处理等)std::this_thread::sleep_for(std::chrono::seconds(10)); // 延时2秒// 操作完成后调用回调函数cout << "Async operation completed!" << endl;callback(data, name); // 调用回调函数
}// 模拟事件触发器
void eventTrigger(std::function<void(int, string)> callback)
{cout << "Waiting for event to trigger..." << endl;// 模拟事件触发(例如点击按钮,满足条件等)std::this_thread::sleep_for(std::chrono::seconds(20)); // 延时3秒int eventData = 100;                                   // 模拟事件产生的数据string eventName = "Event_A";cout << "Event triggered!" << endl;callback(eventData, eventName); // 调用回调函数
}int main()
{// 定义一个回调函数std::function<void(int, string)> callback = std::bind(myCallbackFunction, std::placeholders::_1, std::placeholders::_2);// 异步操作示例cout << "[Main] Starting async operation..." << endl;std::thread asyncThread(asyncOperation, callback, 42, "Async_User");asyncThread.detach(); // 将线程分离,主线程继续运行// 事件触发示例cout << "[Main] Waiting for event trigger..." << endl;std::thread eventThread(eventTrigger, callback);eventThread.join(); // 等待事件触发线程完成cout << "[Main] Program completed." << endl;return 0;
}

总结

从两个样例中可以看出回调函数的一些特性。首先在A中调用B函数和A中调用回调函数的区别是:使用回调函数时不需要定义B函数。其次,当我需要调用同样参数但不同功能的C函数时,使用回调函数仅需要更改调用A函数时的实参即可,更为的灵活。


http://www.ppmy.cn/devtools/156727.html

相关文章

PCL 最小包围圆(二维)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 最小包围圆是指能够包含给定点集中所有点的最小圆。这个算法通常用于计算几何、计算机图形学、机器学习等领域。以下是该算法的基本原理和实现流程: 1. 初始化:将点集中的所有点加入待处理列表。 2. 查找最远点:…

利用HTML和css技术编写学校官网页面

目录 一&#xff0c;图例展示 二&#xff0c;代码说明 1&#xff0c;html部分&#xff1a; 【第一张图片】 【第二张图片】 【第三张图片】 2&#xff0c;css部分&#xff1a; 【第一张图片】 【第二张图片】 【第三张图片】 三&#xff0c;程序代码 一&#xff0c;…

GEE | 2000年至今MODIS蒸散发ET变化分析 (日/月/季节/年)

一、说明 MOD16A2.061是基于Penman-Monteith方程的8天复合蒸散量产品&#xff0c;空间分辨率为500米&#xff0c;时间范围自2001年起至今。基于GEE对ET进行时间变化分析&#xff0c;包括日、月、季节和年&#xff0c;并导出对应的栅格数据。 各位同学可以根据需求更改研究区、…

数据中台是什么?:架构演进、业务整合、方向演进

文章目录 1. 引言2. 数据中台的概念与沿革2.1 概念定义2.2 历史沿革 3. 数据中台的架构组成与关键技术要素解析3.1 架构组成3.2 关键技术要素 4. 数据中台与其他平台的对比详细解析 5. 综合案例&#xff1a;金融行业数据中台落地实践5.1 背景5.2 解决方案5.3 成果与价值 6. 方向…

第九章:归凌-React 国际化引导页

国际化实现 一、安装依赖 需要同时安装 i18next 和 react-i18next 依赖: npm install react-i18next i18next --save二、文件配置 在 src下新建 i18n文件夹,以存放国际化相关配置 i18n中分别新建三个文件: config.ts:对 i18n 进行初始化操作及插件配置en.json:英文语言…

51单片机 05 矩阵键盘

嘻嘻&#xff0c;LCD在RC板子上可以勉强装上&#xff0c;会有一点歪。 一、矩阵键盘 在键盘中按键数量较多时&#xff0c;为了减少I/O口的占用&#xff0c;通常将按键排列成矩阵形式&#xff1b;采用逐行或逐列的“扫描”&#xff0c;就可以读出任何位置按键的状态。&#xf…

吴恩达深度学习——卷积神经网络实例分析

内容来自https://www.bilibili.com/video/BV1FT4y1E74V&#xff0c;仅为本人学习所用。 文章目录 LeNet-5AlexNetVGG-16ResNets残差块 1*1卷积 LeNet-5 输入层&#xff1a;输入为一张尺寸是 32 32 1 32321 32321的图像&#xff0c;其中 32 32 3232 3232是图像的长和宽&…

用 Python 绘制可爱的招财猫

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​​​​​ ​​​​​​​​​ ​​​​ 招财猫&#xff0c;也被称为“幸运猫”&#xff0c;是一种象征财富和好运的吉祥物&#xff0c;经常…