博客园  :: 首页  :: 联系 :: 订阅 订阅  :: 管理

基于C++的多播委托(MulticastDelegate)

Posted on 2008-10-24 22:55  fReeShoOT  阅读(2217)  评论(2)    收藏  举报

介绍

  网络上介绍在C++编译器上实现“委托”的技术文章最著名的就是Don Clugston撰写的《成员函数指针与高性能的C++委托》一文了,它首先解释了成员函数指针在一些常用的编译器中是怎样实现的,然后展示了在多种C++编译器上实现优化而可靠的“委托”。但它过于深入、牵涉到汇编及各种编译期特性、而且其提交的著名代码FastDelegate只实现了单播委托。故国内众多高手也实现一些了稍微简单易懂的C++委托类,流传最广的估计就是jfwan的《一个C#的delegate在C++中的实现》和cpunion的《实现一个高效C++多分派委托类》了。其中jfwan实现的代码精简短小、接口完整,合理的运用宏定义实现了支持不同参数的模板委托类。而cpunion的实现利用模板特化对引用类型返回值提供了支持,而且支持绑定仿函数和=、+=、-=等操作符。想到自己02年刚入行时,为了实现C++回调通知而焦头烂额的样子。看来有必要在众位高手的基础上重构一个新的C++委托类,以加深对C++的理解。

 

框架

  其实与其说是重构,不过说是将jfwan和cpunion两者代码进行合并,各取其优点。总的框架也采用jfwan的宏定义方式。但jfwan的架构是基于Composite模式,将对象组合成树形结构以表示“部分-整体”的层次结构,使得对单个ICallback对象和delegate组合对象的使用具有一致性。见下图:

 

  而新的实现采用聚合方式组织回调类,并且抛弃了用原始指针保存回调链的做法,采用STL的list容器保存回调链,使得

添加、删除委托函数的代码大大精简。并优化了在多播回调时对返回值的处理。架构见下图:

ClassDiagram2

 

特定参数的实现举例
Code


完整的实现下载

https://files.cnblogs.com/freeshoot/HelloDelegate.rar