今天做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++类成员函数的指针调用”