Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1685212
  • 博文数量: 347
  • 博客积分: 9328
  • 博客等级: 中将
  • 技术积分: 2680
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-29 23:45
文章分类

全部博文(347)

文章存档

2016年(1)

2013年(4)

2012年(207)

2011年(85)

2010年(50)

分类: C/C++

2012-06-29 11:11:53

 
C++语言:
template <class R, class P1, class P2>
class IDelegate
{
public:
virtual R Invoke(P1, P2) = 0;
};


template <class T, class R, class P1, class P2>
class CDelegate : public IDelegate<R, P1, P2>
{
protected:

typedef R (T::*pfnHandle)(P1, P2);

const pfnHandle m_pfn;

T* const m_pThis;

public:

CDelegate(T* const pThis, const pfnHandle pfn)
:m_pThis(pThis), m_pfn(pfn)
{
 if (m_pThis == NULL || m_pfn == NULL)
 {
  throw;
 }
}

virtual R Invoke(P1 p1, P2 p2)
{
 return (m_pThis->*m_pfn)(p1, p2);
}

};

class CDelegateSource
{
public:
CDelegateSource()
: m_lpCallBack(NULL)
{
}

void SetCallBack(IDelegate<bool, int, int>* newVal)
{
 m_lpCallBack = newVal;
}

void DoSomething()
{
 for (int i = 0; i < 10; i++)
 {  
  if (m_lpCallBack != NULL)
  {
   m_lpCallBack->Invoke(i, i * i);
  }
 }
}

private:

IDelegate<bool, int, int>* m_lpCallBack;

};

class CDelegateTester
{
private:

bool OnCallBack(int nParam1, int nParam2)
{
 printf("OnCallBack -> nParam1:%d, nParam2:%d\r\n", nParam1, nParam2);

 return true;
}

CDelegate<CDelegateTester, bool, int, int> m_OnCallBack;

public:

CDelegateTester()
: m_OnCallBack(this, OnCallBack)
{
}

void Execute()
{
 CDelegateSource src;
 src.SetCallBack(&m_OnCallBack);
 src.DoSomething();
}
};

void main()
{
CDelegateTester Tester;
Tester.Execute();

getchar();
}

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