libev c++ wrapper function_thunk

libev c++ wrapper function_thunk

本文关键字:thunk function wrapper c++ libev      更新时间:2023-10-16
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++包装器ev++.h。ev++.h 中有一段代码,我知道如何使用它作为 API,但并不完全理解。我可以在事件循环中设置 Ctrl-C 观察程序,如下所示:

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

其中sigint_cb的函数签名是:

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

有人可以解释为什么function_thunk可以神奇地将我的sigint_cb函数签名转换为

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

这是什么C++巫术?谢谢。

function_thunk不会神奇地sigint_cb签名来void (*cb)(EV_P_ ev_watcher *w, int revents)它只是使用正确转换的参数调用sigint_cb

从一开始,function_thunk就是一个函数模板,可以使用类型为 void (*)(watcher &w, int) 的函数指针进行内部化。所以基本上当你在代码中的某个地方编写function_thunk<sigint_cb>时,编译器将创建相应的function_thunk实例

,如下所示:
void function_thunk (EV_P_ ev_watcher *w, int revents)
{
    sigint_cb(*static_cast<watcher *>(w), revents);
}

另请注意,在您的示例中,ev::sigwatcher 是相同的类型,否则模板参数推断/替换 function_thunk 将失败。