メンバー関数ポインター ( DWORD(WINAPI Foo::*)(LPVOID)
) は、関数ポインター ( ) とは異なる型ですDWORD(WINAPI *)(LPVOID)
。メンバー関数には隠しthis
パラメーターがあり、署名の不一致が発生します。
これを行う最も簡単な方法は、C++11 の<thread>
ヘッダーを使用することです。
struct Foo {
void threadProc() {}
};
int main() {
Foo foo;
std::thread t{&Foo::threadProc, foo, /*other arguments to threadProc*/};
t.join();
}
に頼る必要がある場合CreateThread
は、void *
パラメーターを使用してインスタンスを渡します。
struct Foo {
DWORD threadProc() {...}
};
extern "C" DWORD WINAPI proxyThreadProc(LPVOID userData) {
auto foo = static_cast<Foo *>(userData);
if (foo) {foo->threadProc();}
}
int main() {
Foo foo;
CreateThread(..., proxyThreadProc, &foo, ...);
}
std::function
クラス内のものは、プロキシ プロシージャ内から適切な引数を使用して呼び出される限り、( のように) ほとんど何でも好きなものにすることができ、引き続き機能します。