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


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

我的问题与reinterpret_cast操作有关。 g ++允许这样做,Visual Studio 2008不允许。我通过将方法指针值直接存入threadPtr变量来解决VS2008的限制。生成的代码可以正常运行,但是对于应该是一个简单操作的操作,这是一个令人毛骨悚然的解决方法。谁能提供更优雅的选择?

谢谢

-G

编辑:

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

methodPtrTest.cpp:14: warning: converting from ‘void (Test::*)()’ to ‘void (*)(void*)’

最佳答案

好吧,这样做:

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

ThreadPtr threadPtr = &threadMethod;


这样,您要处理的是实际功能,而不是PMF。

10-07 23:59