有关C++类成员函数的指针调用

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

Leave a Reply

Your email address will not be published. Required fields are marked *