///
// 作者:黄崇 潘鹏
// 时间: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);
}