C++ 简单实现委托
2009-05-07 14:07
344 查看
前段时间在公司实习做了电子显微镜的项目,GUI部分是用C#写的,C#中的委托(delegate)用起来实在是太爽了。委托让模块之间的关联程序大大的降低,可是说几乎能做到不关联。这让有些模块的独立性、通用性和重用能力得到大大的加强。在我的毕业设计所做的程序中,人工智能模块我就是做成了一个可以让别人也能灵活使用的单独的模块。其中有一个重要功能就是接受别人的模块所传入的回调函数,在电脑计算完毕之后,回调这个函数告诉GUI模块电脑所下的是哪一步棋。这个回调函数有两种形式,一种是一般的C语言函数或者类的静态函数,另一种就是对方的函数。前一种设置起来已经的方便,不过往往会带着一个多余的空指针参数,以便使用者可以用这个参数还原自己的类型。这样子看起来真的让人觉得很不舒服,而使用后者的话看起来就自然得多了。可是问题就随之而来了,要用C++实现回调一个未知类型对象函数要怎么实现呢。在C#里就特别的简单,直接用delegate关键字定义一个委托就OK了。那么在C++里要如何实现呢。在这儿我写一下我简单实现这个委托的C++例子代码,当然这个委托很有局限,因为这个参数的个数必须事先就确定了。代码如下:
#include <iostream> using namespace std; // 委托类定义 // ClassType 要代理的类类型、ReturnType 委托函数返回类型 // Parameter1Type 委托函数第一个参数类型、Parameter2Type 委托函数第二个参数类型 template<typename ClassType, typename ReturnType, typename Parameter1Type, typename Parameter2Type> class CDelegate { // 定义委托方法 typedef ReturnType (ClassType::*CallBack)(Parameter1Type p1, Parameter2Type p2); public: CDelegate(ClassType *pObj) { pDelegateObj = pObj; callBack = NULL; } // 绑定委托函数 void operator = (CallBack callBack) { this->callBack = callBack; } // 执行委托函数 ReturnType operator () (Parameter1Type p1, Parameter2Type p2) { return (pDelegateObj->*callBack)(p1, p2); } private: ClassType *pDelegateObj; CallBack callBack; }; class CTest { public: double TestFunc(int iP, long lP) { return (double)iP + (double)lP; } }; int _tmain(int argc, _TCHAR* argv[]) { CTest testObj; // 创建一个对象 // 定义一个针对CTest类的TestFunc函数的委托 CDelegate<CTest, double, int, long> myDelegate(&testObj); // 绑定函数 myDelegate = &(CTest::TestFunc); // 执行委托函数 cout << myDelegate(12, 24) << endl; return 0; }
相关文章推荐
- C++委托的简单实现
- 简单的C++委托 —— 用模板类实现类成员函数的回调
- c++高效委托的实现(fast delegate---简单、高效、跨平台)
- 简单的C++委托 —— 用模板类实现类成员函数的回调
- C++ : 用proxy Class实现简单的二维数组。
- 用C++实现一个简单的通讯录
- C++实现简单的单链表
- 二叉树的简单操作(c++实现)
- C++用纯虚函数实现协议委托的例子
- C++单例模式的简单实现
- c++ 链表(模板)简单实现
- C++ 使用模版范式写一个单例模式的类--简单实现单例模式
- B+树插入C++的简单实现
- socket简单实现ftp的文件传送(C++V2.0版,解决数据丢失问题)
- C++实现文件简单加密与解密(读取文件中的字符,对字符转换,然后写入,完成加密,解密反之)
- Linux C++ 实现简单的广播服务
- C++如何简单的实现内存池
- 基于C++实现的简单的图像搜索引擎
- C++实现简单的线程池
- C++ 智能指针——简单实现以及循环引用问题