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

Hi,libev C++ wrapper function_thunk

Tôi đang sử dụng C libev của ++ wrapper ev ++. H. Có đoạn mã này trong ev ++. H mà tôi biết cách sử dụng như một API, nhưng không hiểu đầy đủ. tôi có thể thiết lập một watcher Ctrl-C trong vòng lặp sự kiện như sau:

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

nơi chữ ký chức năng sigint_cb là:

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

Ai đó có thể giải thích tại sao function_thunk kỳ diệu có thể bỏ chức năng sigint_cb của tôi chữ ký cho

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

C++ phù thủy là gì? Cảm ơn.

Trả lời

5

function_thunk không kỳ diệu đúc sigint_cb chữ ký để void (*cb)(EV_P_ ev_watcher *w, int revents) nó chỉ cần gọi sigint_cb với lập luận đúc đúng cách.

Từ đầu, function_thunk là mẫu chức năng có thể được quan sát bằng con trỏ hàm loại void (*)(watcher &w, int). Vì vậy, về cơ bản khi bạn sẽ viết function_thunk<sigint_cb> nơi nào đó trong mã của bạn, trình biên dịch sẽ tạo ra tương ứng function_thunk dụ mà sẽ được xem xét như thế này:

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

Cũng lưu ý rằng trong bạn ví dụ ev::sigwatcher là các loại tương tự, nếu không việc khấu trừ/thay thế đối số mẫu cho function_thunk sẽ không thành công.

+0

Cảm ơn. Vì vậy, nếu tôi nghĩ về std :: bind, tôi ràng buộc sigint_cb với hàm_thunk, đúng không? Vì nó thực sự cảm thấy như std :: bind nào. – lppier

Các vấn đề liên quan