g ++和Visual Studio中方法指针转换规则之间的差异

Gea*_*phy 0 c++ methods pointers g++ visual-studio-2008

struct Test
{
    typedef unsigned (Test::*MethodPtr)();
    unsigned testMethod() {}
};
typedef void (*ThreadPtr)(void *);
ThreadPtr threadPtr = reinterpret_cast<ThreadPtr>(&Test::testMethod);
Run Code Online (Sandbox Code Playgroud)

我想将一个线程发送到特定对象的类方法中.我使用方法指针作为线程入口点,并将对象指针作为唯一参数传递.这可行,因为我的结构中没有任何虚拟声明.

我的问题与reinterpret_cast操作有关.g ++允许这样,Visual Studio 2008则不然.我通过将方法指针值直接memcp到threadPtr变量来解决VS2008的限制.生成的代码工作正常但是这应该是一个简单的操作是一个非常可怕的解决方法.谁能提供更优雅的替代品?

谢谢

-G

编辑:

为了澄清,gcc给出的警告如下:

methodPtrTest.cpp:14: warning: converting from ‘void (Test::*)()’ to ‘void (*)(void*)’
Run Code Online (Sandbox Code Playgroud)

Chr*_*ung 7

好的,这样做:

void threadMethod(void* ptr) {
    static_cast<Test*>(ptr)->testMethod();
}

ThreadPtr threadPtr = &threadMethod;
Run Code Online (Sandbox Code Playgroud)

这样,你就是在处理一个真正的函数,而不是PMF.