今天做libchd中,在写thread的时候,突然厌烦了重写run虚函数的那种thread,而怀念起了vb时代的addressof操作符,于是想能不能通过指针调用类的成员函数做一个通用的thread类,遂开始捣腾。。
首先,想到一个办法,看能否将一个函数指针声明为void(__thiscall *pFunc)(void),然后在类的构造函数中传入一个这样的类型,结果试了&a.Func,编译错误,再试&A::Func,提示void(__thiscall A::*pFunc)()不能转换成void(__thiscall *pFunc)(),失败。。
然后,又想到一个办法,this指针存在ecx寄存器中,能否通过嵌入汇编调用。于是构造函数中传入两个void*,结果编译提示void(__thiscall A::*pFunc)()不能转为void*,“万能指针”在这儿罢工了居然,再次失败。
最后,联想到mem_fun_t和mem_fun_ref_t模板类,遂退一步尝试用模板类解决,终于实现,代码如下:
template<class T>
class MethodThread
: public Thread
{
public:
MethodThread(T *pObj, void(T::*pFunc)())
:m_pObj(pObj), m_pFunc(pFunc) {}
~MethodThread(){Thread::~Thread();}
protected:
virtual bool Run()
{
(m_pObj->*m_pFunc)();
return true;
}
void(T::*m_pFunc)();
T *m_pObj;
};
最后小小佩服下模板类的强大~~
One Reply to “有关C++类成员函数的指针调用”