关于C++中的bind函数

在muduo网络库中出现这样的调用:

 timerfdChannel_.setReadCallback(
        std::bind(&PeriodicTimer::handleRead, this));

这里的

PeriodicTimer::handleRead

的定义如下:

  void handleRead()
  {
    loop_->assertInLoopThread();
    muduo::net::detail::readTimerfd(timerfd_, Timestamp::now());
    if (cb_)
      cb_();
  }

而setReadCallbackd的定义如下:

  void setReadCallback(ReadEventCallback cb)
  { readCallback_ = std::move(cb); }

其中setReadCallback的定义如下:

typedef std::function<void(Timestamp)> ReadEventCallback;

观察发现,这里将一个无参数的可调用对象,绑定到了一个要求有一个Timestamp参数的可调用对象上,特别奇怪。

 

经过查阅资料:

http://www.boost.org/doc/libs/1_56_0/libs/bind/bind.html 

中记载:

Any extra arguments are silently ignored, just like the first and the second argument are ignored in the third example.

 

原因分析:

这里setReadCallback确实是需要一个带有Timestamp参数的对象的函数作为参数,但是经过bind绑定的可调用对象对参数个数并没有限制。

当将bind产生的新对象被调用时的参数个数大于绑定时的规定,那么多余的参数将被忽略,于是就出现了这个例子的情况。

 

 

 

 

 

posted @ 2020-09-17 13:02  熊鑫xxx1x  阅读(365)  评论(0)    收藏  举报