BOOST::Signals2
- /*
- Andy is going to hold a concert while the time is not decided.
- Eric is a fans of Andy who doesn't want to miss this concert.
- Andy doesn't know Eric.
- How can Eric gets the news when Andy's concert is going to take?
- */
- /*
- Singer:被观察者
- Fans:观察者
- */
- #include "stdafx.h"
- #include <iostream>
- #include <boost/signals2.hpp>
- #include <boost/bind.hpp>
- #include <string>
- using namespace std;
- struct Singer
- {
- //定义信号的类型,也就是说 Singer 需要知道 Fans 的响应方式
- //也就是说 Singer 需要知道 Fans 会采用什么样的方式来响应 Singer 所发出的信号
- //或者说 Singer 需要知道 Fans 用什么样的方式来接受 Singer 发出的信号
- //就相当于 Singer 需要知道 Fans的“邮箱”,到时候才可以将信息投递到 Fans 的“邮箱”类型中去
- //Fans 的“邮箱”类型—— void (string time)
- typedef boost::signals2::signal<void (string time)> signalType;
- typedef signalType::slot_type slotType;
- signalType m_signal; //定义一个信号
- //Singer 发布信号
- void PublishTime(string time)
- {
- m_signal(time); //将包含 time 信息的信号m_signal投递到 Fans 的邮箱中去,注意,投递之前这种类型的邮箱必须要和一个具体的Fans联系起来,即必须知道是谁拥有这种类型的邮箱,这一动作通过后边的Subscribe实现。
- }
- //Singer 提供一种注册渠道:Fans们可以通过这个渠道来进行注册,告诉Singer,有新信号的话就发送给我一个消息
- boost::signals2::connection Subscribe(const slotType& fans)
- {//在这里将Fans与Singer建立起一种联系(connection)
- //到后面可以发现,Fans需要调用这个函数,即通过这个渠道告诉Singer有消息就要通知给我
- return m_signal.connect(fans);
- }
- };
- struct Fans
- {
- // m_connection:联系的存在是在整个Fans的生命周期内的,一旦Fans消失,这种联系也就不复存在了
- boost::signals2::scoped_connection m_connection;
- //Fans的响应方式,也就是Fans的邮箱类型,至于里面具体做什么事情,Singer不需要知道。
- void Correspond(string time)
- {
- cout<<"I know the concert time: "<<time<<endl;
- }
- //Fans需要自己确定他要关注(观察)哪一个Singer 的动向
- void Watch(Singer& singer)
- {
- //通过调用Singer的Subscribe函数(渠道)来将自己的邮箱地址告知Singer
- m_connection = singer.Subscribe(boost::bind(&Fans::Correspond, this, _1));
- }
- };
- int main(int argc, char* argv[])
- {
- Singer Andy; //刘德华
- Fans Eric; //Eric
- Eric.Watch(Andy); //Eric告知刘德华:我要关注你的动向,请把你的最新信息发给我
- Andy.PublishTime("2010/10/01");//刘德华发布最新信息,一旦信息发布,Eric的邮箱——void Correspond(string time)就会接受到信息,并进行响应——cout<<….
- return 0;
- }
Reference:
http://www.cppprog.com/boost_doc/doc/html/signals2/tutorial.html
BOOST::Signals2的更多相关文章
- Boost信号/槽signals2
信号槽是Qt框架中一个重要的部分,主要用来解耦一组互相协作的类,使用起来非常方便.项目中有同事引入了第三方的信号槽机制,其实Boost本身就有信号/槽,而且Boost的模块相对来说更稳定. signa ...
- boost之signal
boost里的signal是一个模板类,不区分信号种类,产生信号统一用()调用操作符. 1.回调普通函数代码示例: #include <iostream> #include <str ...
- 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.Signals
1) 观察者模式定义 略,各种设计模式的书上都有定义. 2) 观察者模式一般实现 观察者模式一般实现,都是“被观察者”保存一个“观察者”的列表,循环这个列表来通知“观察者”.代码,其中使用了b ...
- boost signal2 slot_base
先看成员_tracked_objects,从字面上讲是被跟踪的对象,再看,相关函数 bool expired() const,这个函数是检查_tracked_objects是否已经expired.只不 ...
- boost事件处理
尽管这个库的名字乍一看好象有点误导,但实际上并不是如此. Boost.Signals 所实现的模式被命名为 '信号至插槽' (signal to slot).它基于下面概念:当相应的信号被发出时.相关 ...
- boost::signals::signal的使用方法
吃力的讲完boost::signals的ppt.然后接着就是做练习题. 通过讲ppt,发现有一句话说的真好:你自己知道是一回事.你能给别人讲明确又是另外一回事.真的有些东西你自己理解,可是用语言去非常 ...
- boost------signals2的使用1(Boost程序库完全开发指南)读书笔记
signals2基于Boost的另一个库signals,实现了线程安全的观察者模式.在signals2库中,观察者模式被称为信号/插槽(signals and slots),他是一种函数回调机制,一个 ...
- boost------signals2的使用2(Boost程序库完全开发指南)读书笔记
1.应用于观察者模式 本小节将使用signals2开发一个完整的观察者模式示例程序,用来演示信号/插槽的用法.这个程序将模拟一个日常生活场景:客人按门铃,门铃响,护士开门,婴儿哭闹. Ring.h: ...
随机推荐
- jQuery中 $ 符号的冲突问题
jQuery中 $ 符号的冲突问题是常见问题之一. 在jQuery中,$是jQuery的别名,为了书写方便,我们更习惯用$('#id')这一类的方式来书写代码.当同一页面引用了jQuery多个版本 ...
- Hacker(25)----病毒攻防之认识病毒
Internet中,计算机病毒是威胁计算机安全的程序.对于计算机病毒,用户不仅需要掌握其基础知识,还要认识常见的病毒及简单病毒制作方法.无论病毒基础还是制作简单病毒,用户需要掌握防御病毒的有效措施和专 ...
- SDK命令行操作
* 使用前需要先在path中添加Android SDK的环境变量,跟Java JDK的配置相同 我当前目录如下:F:\Program\Android SDK\tools:F:\Program\Andr ...
- (转载)Linux网络配置和setup工具包安装
查看网卡是否正常安装 命令:lspci |grep Ether 1.修改网卡配置 命令: vi /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth ...
- asp.net事件委托易理解实例
比如说一个公司(场景),你是老板,手下有两个员工,小张和小王. 你命令小王,如果小张玩游戏,则小王扣去小张500元钱.这就是现实中的委托.实际上,在写程序中,程序员就是老板,小张和小王就是两个对象.小 ...
- Sql Server根据表名获得所有列及其属性
select a.name columnname,c.name as typename,case when a.is_nullable =0 then 'Not Null' else 'Null' e ...
- 浅谈js闭包
相信很多人只知道闭包这个词但是具体是怎么回事就不太清楚了,最近在群里有很多小伙伴讨论这个问题但还是蒙眬眬的赶脚.索性就写了这篇文章来帮助大家一起理解闭包. 变量作用域 闭包其实想明白了很简单,但是在理 ...
- BestCoder Round #81 (div.2)1001
Machine Accepts: 580 Submissions: 1890 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65 ...
- hdu Red and Black
算法:深搜 题意:就是让你找到一共可以移动多少次,每次只能移到黑色格子上, Problem Description There is a rectangular room, covered with ...
- 慕课Linux学习笔记(三)系统分区
Linux的系统分区 主分区:最多四个 扩展分区:最多只能一个,不能写入数据,只能包含逻辑分区 逻辑分区 必须分区: / (根分区) Swap 分区 (交换分区,内存的两倍,不超过2GB,如果内存大于 ...