关于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产生的新对象被调用时的参数个数大于绑定时的规定,那么多余的参数将被忽略,于是就出现了这个例子的情况。

浙公网安备 33010602011771号