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

c++实现委托

委托

在编程领域里,委托(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
http://www.jsqmd.com/news/1084105/

相关文章:

  • 亚马逊AI业务崛起:MaaS领先、芯片布局完善,大模型借合作曲线救国?
  • iOS审核被拒:4.1 仿制品与马甲包——你的“创新”在苹果眼里只是复制粘贴
  • RISC-V进入汽车芯片:指令集授权风险,比你想的更严重
  • 微信支付:正式下线
  • ST-Link与DAP-Link调试问题解决方案及硬件优化
  • App 爬虫抓包与数据采集实战——mitmproxy + Fiddler
  • 团队协作崩溃前夜:当12人共用同一台远程IDEA服务器时,我们靠这6个JVM+Network调优参数扛过双11峰值
  • 做了5个企业级AI项目后,我对Token服务商选型的几点忠告
  • N-聚糖的分析和未来挑战
  • Mesen模拟器终极指南:如何在Windows和Linux上完美运行NES复古游戏
  • 近3亿美元融资落定!AI绘画社区演语科技崛起,揭示资本转向应用层新趋势
  • 应届生招聘去哪个网站?HR实测靠谱校园招聘平台推荐
  • 碧蓝航线Live2D资源提取:从游戏到创意作品的桥梁探索
  • 【MATLAB】多约束条件无人机安全航路优化
  • Claude Code提效8倍,却让程序员陷入孤独与职业困境?
  • 补体研究为何总卡壳?从通路重建到定量检测的破局思路
  • 英伟达股东大会:黄仁勋称有用AI已至且盈利,Vera Rubin全面投产
  • MiniMax股价震荡、亏损126亿,Coding业务慢一拍,限售股解禁与回A布局成挑战
  • 软考高级系统架构师之分布式数据库一致性协议篇
  • 深度思考模式的“空回答”困局:一个亟待解决的产品级输出缺陷
  • Converseen(批量图片转换及尺寸调整工具)
  • 亚马逊与塔吉特平台采购下单:自养号运营全链路实战解析
  • 仙工智能:“机器人大脑第一股”上市,“卖大脑”却靠“卖身体”,错位模式能走多远?
  • 从G2-Laplacian共流到超辛流:几何演化方程的推导与应用
  • Java RSA数字签名实战:从原理到API安全与软件验签应用
  • 爬虫转大模型:简历项目怎么讲清楚
  • 智能设备OTA升级失败排查与解决方案
  • 告别网盘限速烦恼:九大平台直链下载助手深度解析
  • 10月开源硬件项目精选:ESP32-C6与STM32H743应用解析
  • 用大白话讲清楚深度学习、大模型到底怎么工作的