Signal会安优先级的不同来调用不同组的slot。这样要求signal能根据不同的优先级来管理slot组。典型的实现方法是用std::map。将其定义为如下形式std::map< int, slot >。由于每个优先级下可能有一组slot,所以要将这一组slot组织到一起管理,在boost signal中使用std::list来管理,其可能的形式大体如下std::list< slot >。这样就要修改刚才定义的map了,修改后的map可能的定义如下std::map< int, std::list< slot > >。
在实际的boost signal中并没有直接的存储slot(boost signal库中有个slot类),而是存储了function(boost function类的对象)对象。而且为了方便控制signal与function之间的联系,引入了connection类,用来表示signal与function之间的联系。Connection的对象当然和一个function放在了一起。这样boost signal提供了一个connection_slot_pair类来存储一个function与connection对。这样在boost signal中一个slot组的实际定义如下std::list< connection_slot_pair >。并且被重定义为group_list类型(typedef std::list<connection_slot_pair> group_list)。相应的在boost signal中map的实际定义如下std::map<stored_group, group_list, compare_type>,并且被重定义为slot_container_type(typedef std::map<stored_group, group_list, compare_type> slot_container_type)。将以上的这些东西组织到一个类中,以便于管理。这个类就是named_slot_map。Signal中真正用来管理slot的管理器。
Named_slot_map的类数据成员如下定义(boost源码中的一部分,数据成员部分)
class BOOST_SIGNALS_DECL named_slot_map
{
public:
typedef named_slot_map_iterator iterator;//named_slot_map容器的迭代器
private:
typedef std::list<connection_slot_pair> group_list;//function connection对组类型
typedef std::map<stored_group, group_list, compare_type> slot_container_type;//容器类型
typedef slot_container_type::iterator group_iterator;//容器迭代器类型
typedef slot_container_type::const_iterator const_group_iterator;
slot_container_type groups;//定义一个用来管理function connection组的容器对象
group_iterator back;//容器的迭代器对象
};
Named_slot_map也是一个容器。Stl的容器为了外界方便访问容器内数据单元,提供了迭代器。Named_slot_map也有自己的迭代器。这个迭代器就是named_slot_map_iterator类。Named_slot_map提供了以下方法来获得迭代器iterator begin(),iterator end()。Begin方法提供首迭代器,end方法提供尾迭代器。向容器中插入数据用insert。清除某个数据用而而然erase,清空容器中的所有数据用clear。
posted on 2007-04-25 15:18
walkspeed 阅读(1480)
评论(1) 编辑 收藏 引用 所属分类:
STL、Boost、范型编程 、
C++语言