Различия между правилами приведения указателей методов в g ++ и Visual Studio - PullRequest
0 голосов
/ 17 июня 2011
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 - нет. Я обошел ограничения VS2008, записав значение указателя метода непосредственно в переменную threadPtr. Результирующий код работал нормально, но это ужасный обходной путь для простой операции. Кто-нибудь может предложить более элегантные альтернативы?

Спасибо

-G

Редактировать:

Просто чтобы прояснить, предупреждение, данное gcc, выглядит следующим образом:

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

1 Ответ

7 голосов
/ 17 июня 2011

Хорошо, сделайте это:

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

ThreadPtr threadPtr = &threadMethod;

Таким образом, вы имеете дело с реальной функцией, а не с PMF.

...