当前位置: 首页 > news >正文

回调函数的概念

回调函数的基本概念

回调函数的本质是"你定义,我调用" - 你提供一个函数,系统或框架在特定时机调用它。

实现回调函数的几种方式

1. 函数指针(传统方式)

#include <iostream>// 回调函数类型定义
typedef void (*Callback)(int, const std::string&);// 接受回调函数的函数
void processData(int value, const std::string& name, Callback callback) {std::cout << "处理数据中..." << std::endl;// 处理完成后调用回调函数callback(value, name);
}// 具体的回调函数实现
void myCallback(int num, const std::string& text) {std::cout << "回调函数被调用: " << num << ", " << text << std::endl;
}int main() {processData(42, "Hello", myCallback);return 0;
}

2. std::function(现代方式)

#include <iostream>
#include <functional>void processData(int value, const std::string& name, std::function<void(int, const std::string&)> callback) {std::cout << "处理数据中..." << std::endl;callback(value, name);
}void myCallback(int num, const std::string& text) {std::cout << "回调函数被调用: " << num << ", " << text << std::endl;
}int main() {// 使用函数指针processData(42, "World", myCallback);// 使用lambda表达式processData(100, "Lambda", [](int n, const std::string& s) {std::cout << "Lambda回调: " << n << ", " << s << std::endl;});return 0;
}

3. 函数对象(Functor)

#include <iostream>class MyCallback {
public:void operator()(int value, const std::string& message) {std::cout << "函数对象回调: " << value << ", " << message << std::endl;}
};template<typename CallbackType>
void processData(int value, const std::string& name, CallbackType callback) {std::cout << "处理数据中..." << std::endl;callback(value, name);
}int main() {MyCallback callbackObj;processData(200, "Functor", callbackObj);return 0;
}

实际应用示例

事件处理系统

#include <iostream>
#include <functional>
#include <vector>class Button {
private:std::vector<std::function<void()>> clickCallbacks;public:// 注册点击回调void onClick(std::function<void()> callback) {clickCallbacks.push_back(callback);}// 模拟按钮点击void click() {std::cout << "按钮被点击!" << std::endl;for (auto& callback : clickCallbacks) {callback();}}
};int main() {Button btn;// 注册多个回调函数btn.onClick([]() {std::cout << "执行操作1: 保存文件" << std::endl;});btn.onClick([]() {std::cout << "执行操作2: 更新界面" << std::endl;});// 模拟点击btn.click();return 0;
}

异步操作回调

#include <iostream>
#include <functional>
#include <thread>
#include <chrono>void asyncOperation(std::function<void(bool, const std::string&)> callback) {std::thread([callback]() {std::cout << "开始异步操作..." << std::endl;std::this_thread::sleep_for(std::chrono::seconds(2));// 模拟操作完成bool success = true; // 或 falsestd::string result = "操作完成";callback(success, result);}).detach();
}int main() {std::cout << "主线程继续执行..." << std::endl;asyncOperation([](bool success, const std::string& message) {if (success) {std::cout << "成功: " << message << std::endl;} else {std::cout << "失败: " << message << std::endl;}});// 等待异步操作完成std::this_thread::sleep_for(std::chrono::seconds(3));return 0;
}

回调函数的优点

  1. 灵活性: 可以在运行时决定执行什么代码

  2. 解耦合: 将调用者和被调用者分离

  3. 可扩展性: 容易添加新的回调函数

  4. 异步支持: 非常适合异步编程模式

注意事项

  • 使用 std::function 比原始函数指针更安全灵活

  • 注意回调函数的生命周期管理

  • 在多线程环境中要注意线程安全问题

  • 避免过深的回调嵌套(回调地狱)

回调函数是C++中实现事件驱动编程和异步编程的重要工具,在现代C++开发中广泛应用。

http://www.dtcms.com/a/521410.html

相关文章:

  • 24.异常
  • Linux用户管理命令详解
  • STM32F4串口通信乱码
  • 网站虚拟交易技术怎么做大型新型网站
  • 易讯网站建设为企业做网站
  • vLLM/Docker 部署Qwen2.5-VL-32B模型
  • 广州设计网站建设电子商务网站建设与维护考试题
  • 单片机的开发(未完待续,有时间写)
  • 酒店内容推荐系统:这5个技术坑90%的人都踩过!
  • 定制型网站开发网站建设服务哪便宜
  • 十大下载网站免费安装网站扫二维码怎么做
  • 口碑好的合肥网站建设多说wordpress
  • JetPack 6系统中,默认启用的自动更新机制不完全依赖 unattended-upgrades 包
  • 企业网站开发服务器山东兴华建设集团网站
  • 建设工程网上质检备案网站中英文网站如何做思路
  • 网站不排名一切等于零今天的新闻直播
  • 学seo网站推广好吗网站用户建设的设计与实现
  • 滇中引水工程建设管理局网站安卓aso优化
  • 盐城网站开发招代理松江车墩网站建设
  • asp.net企业网站后台管理系统企业管理软件系统网
  • 现在手机网站用什么做wordpress推广码
  • POI的概念解析及电子地图与POI的联系和区别分析
  • 建什么网站 做 cpa服务器搭建网站环境
  • **标题:发散创新:智能交通系统的深度探究与实现**摘要:本文将详细
  • DDIM(Diffusion)个人总结
  • Radamsa的TCP客户端/服务器模式用法
  • 【Flutter 问题系列第 86 篇】解决 Google Play 提示应用必须支持 16 KB 内存页面大小问题的方案
  • 南京网站设计建设公司电话添加网站描述
  • 网站建设具体步骤应该怎么做ps怎么制作网页
  • 此网站无法提供安全连接 建设银行seo在线优化排名