第13章 网络 Page737~738 “I/O对象”的链式传递 计数器继承enable_shared_from_this<DownCounter>,使用function类型

使用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()的参数。

运行效果:

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值