c++实现委托

📅 2026/6/26 22:39:19
c++实现委托
委托在编程领域里,委托(Delegate)这个概念其实并不复杂,你可以把它通俗地理解为“函数的引用”或者“类型安全的函数指针”。它的核心思想是:把“方法(函数)”当作一个“变量”来传递。就像你把一件具体的事情(比如“发快递”)委托给另一个人去做,你只关心他能不能做这件事,而不关心他具体是谁。核心比喻:生活中的“委托”假设你要举办一场派对,你需要有人负责“播放音乐”。传统做法:你直接喊“张三,去放音乐!”(硬编码,直接调用具体函数)。委托做法:你在门口贴个告示:“需要一个能播放音乐的人(定义委托类型)”。李四走过来说“我能放音乐”,你就把“播放音乐”这个任务交给他(实例化委托)。如果明天李四没空,王五来了,你依然可以把任务交给王五(替换委托目标)。使用场景开发者小A写了一个任务类,专门处理系统分发的任务。但是小A不知道谁在监视任务的执行状态,他也不想知道。于是他做了一个任务委托,专门往外抛消息,谁爱用就用,我不管了。//下一节给出委托和event的具体实现 #include "event.h" class Task { //任务编号 int m_nTaskId; public: Task() { m_nTaskId = 9; } //委托,声明函数签名。 GsDelegatevoid(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 DelegateR (T1, T2, ..., TN) template class R GS_DELEGATE_COMMA GS_DELEGATE_TEMPLATE_PARAMS class GsDelegateR (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_castTFunctor(f))(G