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。