2016-04-11 14 views
8
void set_ (const void *data, void (*cb)(EV_P_ ev_watcher *w, int revents)) throw() 
{ 
    this->data = (void *)data; 
    ev_set_cb (static_cast<ev_watcher *>(this), cb); 
} 

// function callback 
template<void (*function)(watcher &w, int)> 
void set (void *data = 0) throw() 
{ 
    set_ (data, function_thunk<function>); 
} 

template<void (*function)(watcher &w, int)> 
static void function_thunk (EV_P_ ev_watcher *w, int revents) 
{ 
    function 
    (*static_cast<watcher *>(w), revents); 
} 

Hallo,libev C++ Wrapper function_thunk

Ich verwende libev der C++ Wrapper ev ++. H. Es gibt dieses Stück Code in ev ++. H, dass ich weiß, wie man als API verwendet, aber nicht vollständig verstehe. kann ich eine Ctrl-C-Beobachter in der Ereignisschleife wie folgt festgelegt:

ev::sig signal_watcher(evloop); 
signal_watcher.set<sigint_cb>(); 
signal_watcher.start(SIGINT); 

wo sigint_cb die Funktion Signatur:

void sigint_cb(ev::sig &w, int revents) 

Kann jemand erklären, warum function_thunk magisch meine sigint_cb Funktion werfen kann Unterschrift zu

void (*cb)(EV_P_ ev_watcher *w, int revents) 

Was C++ Zauberei ist das? Danke.

Antwort

5

function_thunk nicht auf magische Weise gegossen sigint_cb Signatur void (*cb)(EV_P_ ev_watcher *w, int revents) nennen es nur sigint_cb mit richtig gegossen Argumente.

Von Anfang an function_thunk ist eine Funktionsvorlage, die mit Funktionszeiger vom Typ void (*)(watcher &w, int) instanziiert werden kann. Also im Grunde, wenn Sie function_thunk<sigint_cb> irgendwo in Ihrem Code schreiben, wird Compiler erstellen function_thunk Instanz entspricht, die wie folgt aussehen wird:

void function_thunk (EV_P_ ev_watcher *w, int revents) 
{ 
    sigint_cb(*static_cast<watcher *>(w), revents); 
} 

auch beachten, dass in Ihnen Beispiel ev::sig und watcher die gleichen Typen anders sind, Vorlage Argument Abzug/Substitution für Funktion_thunk würde fehlgeschlagen.

+0

Danke. Wenn ich also in Bezug auf std :: bind denke, binde ich sigint_cb an function_thunk, oder? Denn es fühlt sich wirklich so an, wie es std :: bind tut. – lppier