Chinaunix首页 | 论坛 | 博客
  • 博客访问: 459613
  • 博文数量: 107
  • 博客积分: 6073
  • 博客等级: 准将
  • 技术积分: 790
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-14 15:34
文章分类

全部博文(107)

文章存档

2010年(1)

2009年(106)

分类: C/C++

2009-10-06 23:03:31

今天写引擎的时候,很想加入一些回调函数,以前一直没时间整理这块,这次一定要下决心好好整整代码,纯粹用多态,很多类非要加个帽子,类之间的关系也显的 很单一,有的情况需要用到委托的回调机制,这是个很好的东西,在C#里面是原生支持的,C++里面本来函数指针是个不错的选择,可到了对象里面,成员函数 指针还有那么好用吗?这原本是另C++程序员非常失望和无赖的,难道一说到成员函数指针就真的那么不好用,甚至要沦为被唾弃的命运?并非入此,别忘 了,C++里面还有很强的利器,C#和Java后天才具备的特性可是C++先天就具备的哦,那就是范型,C++里面的用的是模版,而且如果把 模版和成员函数指针结合在一起,那就威力无比了,那应该叫做就是“成员模版函数指针”,C++的教科书上有这个名词吗?我查了查,好像是没有,而且网上很 多资料竟然说这个不能实现之类的话,我都怀疑那些如此断言的人是否太不负责仁了,误导人啊。

当然指想成员函数的指针,这里面的确有段C++设计的问题,C++的成员函数地址通过对象外去引用不能直接通过“&对象.方法”的方式来引用,这个在C++标准里面是没有的,很多人到这里就绝望了,可间接引用呢?而且用很优雅的方式来引用呢?

好了,我也不绕圈子了,给出我的代码,一个简单的 “成员模版函数指针” 的实现,看看C++是如何优雅的实现委托的,真的非常非常的优雅,由于完全自己摸索出来的,真是感慨万千啊。

#include "stdafx.h"

#include

using namespace std;

template
class A
{
private:
typedef int (T::*delegateFun)(int);
T * _This;
delegateFun _deleGate;

public:    

//This被代理的对象, delegateFun被代理的方法

A(T * This, int (T::*delegateFun)(int))
{
_This = This;
_deleGate = delegateFun;
}

    //c被代理的参数
int execue(int c)
{
return (_This->*_deleGate)(c);
}

};


class B
{
public:
int FunA(int a) {return a + 10;}
int FunB(int a) {return a - 10;}
B()
{

}
};

int _tmain(int argc, _TCHAR* argv[])
{


B *objB = new B();

A  delegateObj1(objB, (&B::FunA));
A  delegateObj2(objB, (&B::FunB));


cout << delegateObj1.execue(10) < cout << delegateObj2.execue(20) <

return 0;

}

看完了感觉如何?以后想要设计一个callback回调函数是否明朗了许多?
再也不需要强行搞个static约束方法,那么恶心的东西了吧

阅读(1140) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2009-12-21 13:27:09

问题在于,有时候我们设计一个库,往往实现不知道用户传递进来的typename,所以还可以这样写: class A { public: typedf (void)(*pfn)(LPVOID this) fn_handler; template void SetDelegate(T* pThis,(void)(T::pHandler)()* pHandler) { pThis = (DWORD)pThis; pHandler = (DWORD)pHandler; } void InvokeHandler() { static_cast(pHandler;) pHandler->(pThis); } LPVOID pThis; LPVOID pHandler; }; class B { public: void Handler(); }; int _tmain() { A a; B b; a.SetDelegate(B,&(B::Handler)

chinaunix网友2009-12-17 16:03:10

你在new一个对象的时候,程序结尾的时候没有delete