kategoria: C++
[#1] Hook i wksaznik do funkcji składowej klasy
Da się zrobić by funkcja hook'a była funkcją składową jakiejś klasy?

TygrysekHD
[#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
Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem