简单的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(); 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值