博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
boost signal2 slot_base
阅读量:5020 次
发布时间:2019-06-12

本文共 2668 字,大约阅读时间需要 8 分钟。

先看成员_tracked_objects,从字面上讲是被跟踪的对象,再看,相关函数 bool expired() const,这个函数是检查_tracked_objects是否已经expired.只不过是使用一些设计模式上的东西,理解也比较好理解,

if(apply_visitor(detail::expired_weak_ptr_visitor(), *it)) return true; 实质也就是将*it传入detail::expired_weak_ptr_visitor(),其实就是调用仿函数并传入参数
class expired_weak_ptr_visitor      {      public:        typedef bool result_type;        template
bool operator()(const WeakPtr &wp) const { return wp.expired(); } };

  详细源码如下

#ifndef BOOST_SIGNALS2_SLOT_BASE_HPP#define BOOST_SIGNALS2_SLOT_BASE_HPP#include 
#include
#include
#include
#include
#include
#include
#include
namespace boost{ namespace signals2 { namespace detail { class tracked_objects_visitor; class trackable_pointee; typedef boost::variant
, boost::weak_ptr
, detail::foreign_void_weak_ptr > void_weak_ptr_variant; typedef boost::variant
, detail::foreign_void_shared_ptr > void_shared_ptr_variant; class lock_weak_ptr_visitor { public: typedef void_shared_ptr_variant result_type; template
result_type operator()(const WeakPtr &wp) const { return wp.lock(); } // overload to prevent incrementing use count of shared_ptr associated // with signals2::trackable objects result_type operator()(const weak_ptr
&) const { return boost::shared_ptr
(); } }; class expired_weak_ptr_visitor { public: typedef bool result_type; template
bool operator()(const WeakPtr &wp) const { return wp.expired(); } }; } class slot_base { public: typedef std::vector
tracked_container_type; typedef std::vector
locked_container_type; const tracked_container_type& tracked_objects() const {return _tracked_objects;} locked_container_type lock() const { locked_container_type locked_objects; tracked_container_type::const_iterator it; for(it = tracked_objects().begin(); it != tracked_objects().end(); ++it) { locked_objects.push_back(apply_visitor(detail::lock_weak_ptr_visitor(), *it)); if(apply_visitor(detail::expired_weak_ptr_visitor(), *it)) { throw expired_slot(); } } return locked_objects; } bool expired() const { tracked_container_type::const_iterator it; for(it = tracked_objects().begin(); it != tracked_objects().end(); ++it) { if(apply_visitor(detail::expired_weak_ptr_visitor(), *it)) return true; } return false; } protected: friend class detail::tracked_objects_visitor; void track_signal(const signal_base &signal) { _tracked_objects.push_back(signal.lock_pimpl()); } tracked_container_type _tracked_objects; }; }} // end namespace boost#endif // BOOST_SIGNALS2_SLOT_BASE_HPP

  

转载于:https://www.cnblogs.com/csxy/p/5457102.html

你可能感兴趣的文章
JavaSE| String常用方法
查看>>
14.精益敏捷项目管理——认识精益笔记
查看>>
从0开始实现STM32L4XX输出50Hz方波
查看>>
caffe mnist LeNet 参数详细介绍
查看>>
CocoaPods建立私有仓库
查看>>
HIVE中的order by操作
查看>>
Centos下新建用户及修改用户目录
查看>>
iOS开发IPhone以及iPad尺寸汇总
查看>>
Spring Boot RestTemplate文件上传
查看>>
myBatis自动生成mapping,dao和model
查看>>
Android Serivce 高级篇AIDL讲解
查看>>
SpringBoot学习笔记(2):引入Spring Security
查看>>
图片加水印 PDF取缩略图
查看>>
bzoj 4180: 字符串计数
查看>>
安卓--布局设计-计算器
查看>>
Java重写《C经典100题》 --27
查看>>
ABP中的拦截器之EntityHistoryInterceptor
查看>>
【oracle】oracle数据库建立序列、使用序列实现主键自增
查看>>
使用SQLiteDatabase操作SQLite数据库第二种方法
查看>>
vue,一路走来(12)--父与子之间传参
查看>>