使用function类型,而且必须用上bind()方法。boost库先有得boost::bind()方法,后被纳入C++11新标准变成std::bind()。同样的情况发生在shared_ptr<T>。为避免冲突,有两个建议,一是相关代码写上完整的命名空间限定,二是尽量避免混用存在同名的定义
危险:混用STL和boost的同名定义
asio默认使用boost版本的绑定工具。怎么个默认法呢?比如当绑定需要使用入参占位符时,在boost::asio::placeholders之下定义的占位符变量的类型,全是boost库内定义的类型(建议查阅“boost\asio\placeholder.hpp”文件)。如果出现混用,比如使用std::bind()方法,但方法中用到的入参占位符却使用boost定义的版本,会出现一堆编译问题。
下面放弃lambda,改用function对象作为timer.async_wait()入参的完整代码。另一个变化是DownCounter的operator()的重载被改为普通成员函数:
代码如下:
47行代码通过shared_from_this()方法安全正确地复制智能指针counter,这很重要
48~50行,函数绑定的意义是,为对象shared_this的成员函数OnTimerExpired绑定一个占位符,好接收OnTimerExpired()的参数。