一个delegate用MARCO实现的问题
我用MARCO写了段delegate的实现,比较简陋,考虑的也不够仔细,希望大家给给意见,让我得以完善,谢谢。
以后我还打算用template写一个,但网上有好多用template写的版本,写法都有不同,各位大侠能给出一段比较好的让我学一下吗?
//MARCO 版
//{{AFX MARCO
#define CDelegate(rt,name,args,vars)class name{\
public:\
name(){\
m_pFunc = NULL;\
m_spFunc = NULL;\
m_pThis = NULL;\
}\
name(void* pObj,...){\
m_pThis = pObj;\
va_list marker;\
va_start(marker,pObj);\
m_pFunc = va_arg(marker,ptr_func);\
va_end(marker);\
va_start(marker,pObj);\
m_spFunc = va_arg(marker,s_ptr_func);\
va_end(marker);\
}\
virtual ~name(){}\
public:\
rt operator()(args){\
if (m_pThis)\
return (((name*)m_pThis)->*m_pFunc)(vars);\
else\
return (m_spFunc)(vars);\
}\
const name& operator=(name obj){\
this->m_pFunc = obj.m_pFunc;\
this->m_spFunc = obj.m_spFunc;\
this->m_pThis = obj.m_pThis;\
return *this;\
}\
bool operator!(){\
return (!m_pFunc);\
}\
typedef rt (name::* ptr_func)(args);\
typedef rt (* s_ptr_func)(args);\
protected:\
ptr_func m_pFunc;\
s_ptr_func m_spFunc;\
void* m_pThis;\
};
//}}AFX MARCO