Самое краткое решение - определить в заголовочном файле, который используется всеми вашими кодами:
template <typename T, void (T::*M)()>
void* thunk(
void* p)
{
T* pt = static_cast<T*>(p);
(pt->*M)();
return 0;
}
Возможно, вы захотите определить 4 версии: по одной, в которой thunk возвращает void и void *
, и по одной, где функция-член возвращает void и void *
. Таким образом, компилятор может соответствовать лучшему, в зависимости от обстоятельств (и на самом деле он будет жаловаться, если все не совпадает.)
Тогда все, что вам нужно вводить каждый раз, когда вы сталкиваетесь с одной из следующих ситуаций:
pthread_create (& pid, 0, & thunk <Все, что угодно :: doit>, & w);
Это будет работать даже когда метод закрыт, если на метод ссылаются из кода класса. (Если нет, я должен задаться вопросом, почему код ссылается на закрытый метод.)