标签归档:bind

定时器接口优化之function和bind

框架早年的timer是通过一系列函数指针来封装回调函数,期间使用0x的function和bind优化了一波,极大的简化了代码,但是我们的timer回调函数的形式仍然保持着void timer_callback(int fd, short event, void *arg);的形式(仿libevent与普通fd事件回调函数保持一致)。但在大量的开发实践中,绝大部分用不到其中任何一个参数,极少部分会使用到arg,而我们仍然不得不完整的写完整个函数头部。经过分析发现我们可以利用function和bind的一些“特质“来再度优化这个繁琐的回调范式。

  1. std::bind让std::function看起来可以接受任意形式的回调函数形式,但std::function严格限制调用时的实参形式必须跟定义时形参保持一致
  2. std::bind并不是只能bind函数,还可以嵌套bind
  3. 让timer支持任意类型。
    1) timer内部持有的function切换成std::function<void(void)>,通过内部嵌套bind来兼容原回调形式void callback_old(int, short, void*);
    2)timer接口支持任意类型(AddTimer(std::function<void(void)>)),只需bind时具名所有参数即可(例如void callback_xxxx(int type, void *arg); AddTimer(std::bind(callback_xxxx, ARG_type, ARG_ptr)))。