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

转载于:https://www.cnblogs.com/black/p/5171744.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值