尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

c++实现委托

c++实现委托
📅 发布时间:2026/6/26 22:40:55

委托

在编程领域里,委托(Delegate) 这个概念其实并不复杂,你可以把它通俗地理解为“函数的引用”或者“类型安全的函数指针”。

它的核心思想是:把“方法(函数)”当作一个“变量”来传递。 就像你把一件具体的事情(比如“发快递”)委托给另一个人去做,你只关心他能不能做这件事,而不关心他具体是谁。

核心比喻:生活中的“委托”
假设你要举办一场派对,你需要有人负责“播放音乐”。
传统做法:你直接喊“张三,去放音乐!”(硬编码,直接调用具体函数)。
委托做法:你在门口贴个告示:“需要一个能播放音乐的人(定义委托类型)”。李四走过来说“我能放音乐”,你就把“播放音乐”这个任务交给他(实例化委托)。如果明天李四没空,王五来了,你依然可以把任务交给王五(替换委托目标)。

使用场景

开发者小A写了一个任务类,专门处理系统分发的任务。但是小A不知道谁在监视任务的执行状态,他也不想知道。于是他做了一个任务委托,专门往外抛消息,谁爱用就用,我不管了。

//下一节给出委托和event的具体实现 #include "event.h" class Task { //任务编号 int m_nTaskId; public: Task() { m_nTaskId = 9; } //委托,声明函数签名。 GsDelegate<void(std::string, int)> OnTaskCompleted; void startTask() { //执行任务。。。 //任务结束后,往外抛消息 OnTaskCompleted("Task Completed", m_nTaskId); } };

  小A请婚假了,他要去遥远的赞比亚度蜜月,请了3个月假。小B收到领导指示,任务结束后要通知用户。他看了小A的实现,庆幸万分。能够做,而且还不要改小A的代码。于是小B写了一个任务监视类。

//下一节给出委托和event的具体实现 #include "event.h" class TaskWatcher { public: TaskWatcher(Task* pTask) { //绑定委托到本类实例的TaskEvent成员方法 pTask->OnTaskCompleted.Add(this, &TaskWatcher::TaskEvent); } void TaskEvent(std::string info, int id) { cout << "Task " << id << " say :" << info << endl; } };

以上就是委托的经典用法,说穿了就是解耦。

委托的模版实现

全是模版代码,可以仔细阅读,提高水平。也可以不阅读,知道怎么用就行了。

//delegateT.h #if GS_DELEGATE_NUM_ARGS == 0 #define GS_DELEGATE_COMMA #else #define GS_DELEGATE_COMMA , #endif #ifndef NULL #define NULL 0 #endif //------------------------------------------------------------------------- // class Delegate<R (T1, T2, ..., TN)> template <class R GS_DELEGATE_COMMA GS_DELEGATE_TEMPLATE_PARAMS> class GsDelegate<R (GS_DELEGATE_TEMPLATE_ARGS)> { // Declaractions private: class DelegateImplBase { // Fields public: DelegateImplBase* Previous; // singly-linked list // Constructor/Destructor protected: DelegateImplBase() : Previous(NULL) { } DelegateImplBase(const DelegateImplBase& other) : Previous(NULL) { } public: virtual ~DelegateImplBase() { } // Methods public: virtual DelegateImplBase* Clone() const = 0; virtual R Invoke(GS_DELEGATE_FUNCTION_PARAMS) const = 0; }; template <class TFunctor> struct Invoker { static R Invoke(const TFunctor& f GS_DELEGATE_COMMA GS_DELEGATE_FUNCTION_PARAMS) { return (const_cast<TFunctor&>(f))(G

相关新闻

  • 【AI大模型进阶】“预训练”和“微调”的区别:就像是“基础教育”和“岗前培训”
  • 微信支付:正式下线
  • ST-Link与DAP-Link调试问题解决方案及硬件优化

最新新闻

  • 终极指南:5分钟快速上手ExtractorSharp游戏资源编辑器
  • Frida Gadget配置文件详解:从基础集成到高级动态分析实战
  • 5分钟实战:用Aircrack-ng抓取WiFi握手包,从原理到硬件避坑指南
  • 139、飞控中的气压计选型:MS5611、BMP280
  • 基于STM32的数字卦占卦工具设计与实现
  • 如何快速扩展虚拟显示器:提升工作效率的完整指南

日新闻

  • 单节点跑业务稳如泰山 扩容高可用集群反而频繁卡死 复盘完整连接交互揪出深层根因
  • Boss直聘批量投递工具:5倍效率提升的求职价值重构指南
  • 3分钟解锁VLC点击暂停插件:让视频控制变得如此简单!

周新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号