函数及类成员函数回调模板化

来源:互联网 发布:淘宝男模特啥要求 编辑:程序博客网 时间:2024/06/13 00:43

///////////////////////////////////////////////////
// 作者:黄崇 潘鹏
// 时间:2010-11-29
// 功能:回调模板化

// 转载请注明出处,谢谢
///////////////////////////////////////////////////
//
// 使用方法
/*
class A
{
public:
 BOOL A_test(int a)
 {
  if (a > 0)
  {
   printf("%d > 0/n", a);
   return TRUE;
  }

  printf("%d < 0/n", a);
  return FALSE;
 }
};

class B
{
private:
 CallbackObject<BOOL, int>* m_pCallback;
public:
 B()
 {
  m_pCallback = NULL;
 }
 void SetCallback(CallbackObject<BOOL, int>* pCallback){ m_pCallback = pCallback; }

 void B_test(int a)
 {
  if (m_pCallback)
   m_pCallback->call(a);
 }
};

void main()
{
 A a;
 B b;

 CallbackObject<BOOL, int>* pCallback = BindCallback(&a, &A::A_test);
 b.SetCallback(pCallback);
 b.B_test(2);

 delete pCallback;
}
*/

#ifndef _PPCALLBACK_
#define _PPCALLBACK_

template<typename R, typename V>class CallbackObject
{
public:
 virtual ~CallbackObject(){}
 virtual R call(V val) = 0;
};

template<typename R, typename V>class CallbackFunction : public CallbackObject<R, V>
{
public:
 explicit CallbackFunction(R(*function)(V)){ m_function = function; }
 virtual R call(V val){ return (*m_function)(val); }
protected:
 R  (*m_function)(V);
};

class CallbackException
{
};

template<typename R, typename O, typename V>class CallbackMemberFunction : public

CallbackObject<R, V>
{
public:
 explicit CallbackMemberFunction(O* pObject, R(O::*function)(V))
 {
  m_pObject = pObject;
  m_function = function;
 }
 virtual R call(V val)
 {
  if (m_pObject == 0)
   throw CallbackException();
  return (m_pObject->*m_function)(val);
 }
protected:
 O*  m_pObject;
 R  (O::*m_function)(V);
};

template<typename R, typename V>CallbackObject<R, V>* BindCallback(R(*function)(V))
{
 return new CallbackFunction<R, V>(function);
}

template<typename R, typename O, typename V>CallbackObject<R, V>* BindCallback(O* pObject,

R(O::*function)(V))
{
 return new CallbackMemberFunction<R, O, V>(pObject, function);
}