先看成员_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<typename WeakPtr>
bool operator()(const WeakPtr &wp) const
{
return wp.expired();
}
};
详细源码如下
#ifndef BOOST_SIGNALS2_SLOT_BASE_HPP
#define BOOST_SIGNALS2_SLOT_BASE_HPP #include <boost/shared_ptr.hpp>
#include <boost/weak_ptr.hpp>
#include <boost/signals2/detail/foreign_ptr.hpp>
#include <boost/signals2/expired_slot.hpp>
#include <boost/signals2/signal_base.hpp>
#include <boost/variant/apply_visitor.hpp>
#include <boost/variant/variant.hpp>
#include <vector> namespace boost
{
namespace signals2
{
namespace detail
{
class tracked_objects_visitor;
class trackable_pointee; typedef boost::variant<boost::weak_ptr<trackable_pointee>, boost::weak_ptr<void>, detail::foreign_void_weak_ptr > void_weak_ptr_variant;
typedef boost::variant<boost::shared_ptr<void>, detail::foreign_void_shared_ptr > void_shared_ptr_variant;
class lock_weak_ptr_visitor
{
public:
typedef void_shared_ptr_variant result_type;
template<typename WeakPtr>
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<trackable_pointee> &) const
{
return boost::shared_ptr<void>();
}
};
class expired_weak_ptr_visitor
{
public:
typedef bool result_type;
template<typename WeakPtr>
bool operator()(const WeakPtr &wp) const
{
return wp.expired();
}
};
} class slot_base
{
public:
typedef std::vector<detail::void_weak_ptr_variant> tracked_container_type;
typedef std::vector<detail::void_shared_ptr_variant> 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
boost signal2 slot_base的更多相关文章
-
boost signal2 trackable
挺简单的一个类,只是维护了一个成员 shared_ptr<detail::trackable_pointee> _tracked_ptr; 这样看来的话,所谓的track还是基于智能指针, ...
-
C++ Boost signal2信号/插槽
#include "stdafx.h" #include "boost/signals2.hpp" #include "boost/bind.hpp& ...
-
Windows下如何使用BOOST C++库 .
Windows下如何使用BOOST C++库 我采用的是VC8.0和boost_1_35_0.自己重新编译boost当然可以,但是我使用了 http://www.boostpro.com/produc ...
-
比特币源码分析--C++11和boost库的应用
比特币源码分析--C++11和boost库的应用 我们先停下探索比特币源码的步伐,来分析一下C++11和boost库在比特币源码中的应用.比特币是一个纯C++编写的项目,用到了C++11和bo ...
-
boost::bind 学习
最近学习了太多与MacOS与Iphone相关的东西,因为不会有太多人有兴趣,学习的平台又是MacOS,不太喜欢MacOS下的输入法,所以写下来的东西少了很多. 等我学习的东西慢慢的与平台无关的时 ...
-
c++ 库 boost安装
http://blog.chinaunix.net/uid-12226757-id-3427282.html ubuntu apt-get install libboost-dev 全部: apt-g ...
-
Using Boost Libraries in Windows Store and Phone Applications
Using Boost Libraries in Windows Store and Phone Applications RATE THIS Steven Gates 18 Jul 2014 5:3 ...
-
boost开发指南
C++确实很复杂,神一样的0x不知道能否使C++变得纯粹和干爽? boost很复杂,感觉某些地方有过度设计和太过于就事论事的嫌疑,对实际开发工作的考虑太过于理想化.学习boost本身就是一个复杂度,有 ...
-
boost强分类器的实现
boost.cpp文件下: bool CvCascadeBoost::train( const CvFeatureEvaluator* _featureEvaluator, int _numSampl ...
随机推荐
-
Windowns 10打开此电脑缓慢问题的一种解决办法
上个月刚配的台式,i7 6700K + 16GB + PM961用起来爽得不行. 不过最近两天突然发现,打开"此电脑"总会卡住,窗口里面也不显示磁盘.地址栏缓慢刷新. 一般此类问题 ...
-
Android常用控件及对应Robotium API
最近发现Android控件不熟悉,看Robotium的API都费劲. 常用Android控件: 控件类型 描述 相关类 Button 按钮,可以被用户按下或点击,以执行⼀个动作 Button Text ...
-
Spring基本框架
1.Spring基本框架的概念 Spring 框架是一个分层架构,由 7 个定义良好的模块组成.Spring模块构建在核心容器之上,核心容器定义创建.配置和管理bean的方式.组成Spring框架的每 ...
-
JQuery text()、html() 以及 val()
获得内容 - text().html() 以及 val() 三个简单实用的用于 DOM 操作的 jQuery 方法: text() - 设置或返回所选元素的文本内容 html() - 设置或返回所选元 ...
-
background总结
1. background-position background-position的百分比属性规则是:图片本身(x%,y%)的那个点,与背景区域的(x%,y%)的那个点重合. 具体可参考: http ...
-
向maven中添加本地jar包
<dependency> <groupId>org.csource</groupId> <artifactId>fastdfs-client-java& ...
-
Jquery基础知识01
1:$(document).ready()function{}和window.onload()的区别. 1:$(document).ready()function{} 该方法等到Dom结构绘制完毕 ...
-
java集合-HashMap源码解析
HashMap 键值对集合 实现原理: HashMap 是基于数组 + 链表实现的. 通过hash值计算 数组索引,将键值对存到该数组中. 如果多个元素hash值相同,通过链表关联,再头部插入新添加的 ...
-
sklearn数据库-【老鱼学sklearn】
在做机器学习时需要有数据进行训练,幸好sklearn提供了很多已经标注好的数据集供我们进行训练. 本节就来看看sklearn提供了哪些可供训练的数据集. 这些数据位于datasets中,网址为:htt ...
-
python learning 字符串方法
一.重点掌握的6种字符串方法: 1.join命令 功能:用于合并,将字符串中的每一个元素按照指定分隔符进行拼接 程序举例: seq = ['1','2','3','4'] sep = '+' v = ...