2016-04-11 8 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); 
} 

हाय,libev C++ आवरण function_thunk

मैं libev के सी ++ आवरण EV ++। ज उपयोग कर रहा हूँ। ev ++ में कोड का यह टुकड़ा है। एच मुझे पता है कि एपीआई के रूप में कैसे उपयोग करें, लेकिन पूरी तरह से समझ में नहीं आता है।

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

जहां sigint_cb के समारोह हस्ताक्षर है:: मैं इस प्रकार घटना पाश में एक Ctrl-C द्रष्टा सेट कर सकते हैं

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

कोई व्याख्या कर सकते हैं क्यों function_thunk जादुई मेरी sigint_cb समारोह डाल सकता

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

क्या सी ++ जादूगर यह हस्ताक्षर है? धन्यवाद।

उत्तर

5

function_thunk नहीं जादुई sigint_cb void (*cb)(EV_P_ ev_watcher *w, int revents) को हस्ताक्षर डाली है यह सिर्फ ठीक से casted तर्क के साथ sigint_cb कहते हैं।

शुरुआत से, function_thunk एक फ़ंक्शन टेम्पलेट है जिसे void (*)(watcher &w, int) प्रकार के फ़ंक्शन पॉइंटर के साथ intstantiated किया जा सकता है। तो मूल रूप से जब आप अपने कोड में कहीं function_thunk<sigint_cb> लिखेंगे, संकलक इसी function_thunk उदाहरण है, जिसमें इस तरह लग रही हो जाएगा पैदा करेगा:

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

भी ध्यान रखें कि आप उदाहरण ev::sig और watcher एक ही प्रकार के होते हैं, अन्यथा function_thunk के लिए टेम्पलेट तर्क कटौती/प्रतिस्थापन विफल हो जाएगा।

+0

धन्यवाद। तो अगर मैं std :: bind के संदर्भ में सोचता हूं, तो मैं sigint_cb को function_thunk पर बाध्य कर रहा हूं, है ना? क्योंकि यह वास्तव में लगता है कि std :: बाइंड क्या करता है। – lppier

संबंधित मुद्दे