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