张志松
记录工作点滴,留下人生轨迹。(zezese@163.com)
posts - 68,  comments - 11,  trackbacks - 0

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();
}

posted on 2010-07-25 15:57 张志松 阅读(833) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理



<2012年2月>
2930311234
567891011
12131415161718
19202122232425
26272829123
45678910

常用链接

留言簿(2)

随笔分类

随笔档案

文章分类

文章档案

转载

搜索

  •  

最新评论

阅读排行榜

评论排行榜