[#2]
Re: Hook i wksaznik do funkcji składowej klasy
@tygrysekHD,
post #1
Osobiście ostatnio stosuję adapter w postaci szablonu; jest to o tyle wygodne, że prosty szablon pasuje często do wielu callbacków i metod. Zresztą zmodyfikować go jest prosto:
struct A
{
void run(void) { printf("tutaj\n");}
};
template <class A, void (A::*method)(void)>
void *threadCB(void *param)
{
A *worker = static_cast<A *>(param);
(worker->*method)();
return NULL;
}
int main()
{
pthread_t tid;
A a;
pthread_create(&tid, NULL, threadCB<A, &A::run>, &a);
pthread_join(tid, NULL);
return 0;
}
Ten szablon nadaje się do każdej każdej metody bezparametrowej zwracającej void; po drobnej modyfikacji można zwracać dowolną wartość. Jeśli chcesz adaptować bardziej złożone metody wieloparametrowe, spójrz w boost::bind

.
Adapter może też być zwyczajną funkcją C, tylko wtedy będzie odrobinę mniej uniwersalny (osobny dla każdej adaptowanej klasy). Bez żadnej adaptacji można użyć metody statycznej; tylko że aby udostępnić w niej dane obiektu musisz jawnie przekazać do niej (jako user_data, jeśli callback to przewiduje) wskaźnik na obiekt, bo tylko przez ten wskaźnik zyskasz dostęp do niestatycznych składowych (danych i metod) klasy.
EDIT: jeśli szablon będzie miał dodatkowe parametry pozatypowe, można w nich związać dodatkowe argumenty wywołania metody (nie musi być wtedy bezparametrowa). Pod warunkiem, że będą spełniały wymogi dla pozatypowych parametrów szablonów... Inaczej łatwiej już skorzystać z boost::bind.
EDIT: musiałem wyedytować znaczki w /code/...
Ostatnia aktualizacja: 03.05.2012 00:15:09 przez ppascal
Ostatnia aktualizacja: 03.05.2012 00:15:42 przez ppascal