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

在C++中实现C#的委托

2013-02-01 14:02 351 查看
通过研究,这两天写了一个C++ 的Delegate。关键调用部分使用汇编写成,效率是可以保证的。同时支持32位和64位系统。

支持“+=”操作符构造委托链。

但是,目前不支持将“虚函数”作为委托的目标函数。普通成员函数和静态成员函数都可以的。

目前也不支持异步的委托。

基本用法如下:

(其实我是重写了这文章中的例子:http://blog.csdn.net/cjl5678/article/details/7649686)

class CKeepManager
{
public:
CKeepManager()
{
}
void KeepPet(char* name,Tron_Delegate &MethodOfKeepPets)
{
MethodOfKeepPets(this,1,(void**)&name);//通过重载“()”运算符实现。第一个参数是sender,就是C#中,事件回调函数中的那个参数sender。在这里,指明此回调的来源,就是当前对象本身。
}

//////////////////////////////////////////////////////////////////////////
void KeepDogs(void* pSource,int argc,void **argv)
{
char* name=(char*)argv[0];
printf("%s, 需要到商店A买狗粮\n",name);
}
void KeepCats(void* pSource,int argc,void **argv)
{
char* name=(char*)argv[0];
printf("%s, 需要到商店B买猫粮\n",name);
}
};

int main(int argc, char* argv[])
{
CKeepManager KM;
Tron_Delegate methodOfKeepPets(&KM,&CKeepManager::KeepDogs);//将对象实例与对象方法,关联到“委托实例”中。
//在这个例子中,有点特殊,sender与接收者都是KM对象。
KM.KeepPet("养狗",methodOfKeepPets);//将方法设置成了一个参数,传入后调用
//如果你“养猫”了,就可以这样写
methodOfKeepPets=Tron_Delegate(&KM,&CKeepManager::KeepCats);
KM.KeepPet("养猫",methodOfKeepPets);//将方法设置成了一个参数,传入后调用
}


希望大家多多指教!

委托类Tron_Delegate的实现原理与代码下载位于:
http://www.winsxs.org/?OtherTech/thread-14-1-1
编译源码时,需要使用 NASM.exe,可以在其官方网站下载
http://www.nasm.us/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: