Как преобразовать void (__thiscall MyClass::*)(void *) в void (__cdecl *)(void *)

Я хочу создать класс "IThread", который может скрыть создание потока. Подкласс реализует метод ThreadMain и вызывает его автоматический вызов, который выглядит следующим образом:

class IThread
{
public:
    void BeginThread();
    virtual void ThreadMain(void *) PURE;
};
void IThread::BeginThread()
{
    //Error : cannot convert"std::binder1st<_Fn2>" to "void (__cdecl *)(void *)"
    m_ThreadHandle = _beginthread(
                     std::bind1st( std::mem_fun(&IThread::ThreadMain), this ),
                     m_StackSize, NULL);
    //Error : cannot convert void (__thiscall* )(void *) to void (__cdecl *)(void *)
      m_ThreadHandle = _beginthread(&IThread::ThreadMain, m_StackSize, NULL);
}

Я искал вокруг и не могу понять это. Есть кто-нибудь, кто сделал такую ​​вещь? Или я иду неправильным путем? ТИА

1 ответ

Решение

Ты не можешь

Вместо этого вы должны использовать статическую функцию (не статическую функцию-член, а свободную функцию).

// IThread.h
class IThread
{
public:
    void BeginThread();
    virtual void ThreadMain() = 0;
};

// IThread.cpp
extern "C"
{
    static void __cdecl IThreadBeginThreadHelper(void* userdata)
    {
        IThread* ithread = reinterpret_cast< IThread* >(userdata);
        ithread->ThreadMain();
    }
}
void IThread::BeginThread()
{
    m_ThreadHandle = _beginthread(
                     &IThreadBeginThreadHelper,
                     m_StackSize, reinterpret_cast< void* >(this));
}
Другие вопросы по тегам