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。
关于c++ - g++ 和 Visual Studio 中方法指针转换规则的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6384292/