您的位置:首页 > 编程语言 > C语言/C++

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: