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

时间:2011-06-17 10:12:27

标签: c++ visual-studio-2008 pointers methods g++

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则不然。我通过将方法指针值直接memcp到threadPtr变量来解决VS2008的限制。生成的代码工作正常但是这应该是一个简单的操作是一个非常可怕的解决方法。任何人都可以提供更优雅的替代品吗?

由于

-G

修改:

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

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

1 个答案:

答案 0 :(得分:7)

好的,这样做:

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

ThreadPtr threadPtr = &threadMethod;

那样,你正在处理一个真正的函数,而不是PMF。