boost库:事件处理
boost库的signal所实现的模式被命名为信号至插槽,当对应的信号被发出时,相关联的插槽即被执行。
#include <boost/signal.hpp>
#include <iostream> void func() {
std::cout << "Hello, world!" << std::endl;
} int main() {
boost::signal<void()> s;
s.connect(func);
s();
return ;
}
boost::signal被实现为一个模板函数,具有被用作为事件处理器的函数的签名,该签名也是它的模板参数。上例中,只有签名为void()的函数才可以被成功关联至信号s。当信号s被触发时,func函数被调用。
上述例子也可以使用boost.function来实现:
#include <boost/function.hpp>
#include <iostream> void func() {
std::cout << "Hello, world!" << std::endl;
} int main() {
boost::function<void()> f;
f = func;
f();
return ;
}
但signals可以关联多个函数至单个信号,如下:
#include <boost/signal.hpp>
#include <iostream> void func1() {
std::cout << "Hello" << std::flush;
} void func2() {
std::cout << ", world!" << std::endl;
} int main() {
boost::signal<void()> s;
s.connect(func1);
s.connect(func2);
s();
return ;
}
boost::signal可以通过反复调用connect()方法来把多个函数赋值给单个特定信号。当该信号被触发时,这些话函数按照之前用connect()关联的顺序来执行。执行顺序也可以通过connect()方法的另一个重载版本来明确指定,如s.connect(1, func2); s.connect(0, func1)
释放关联,使用disconnect()方法,s.disconnect(func2)。
s.num_slots() 返回已关联函数的数量。
s.empty() 是否关联函数。
s.disconnect_all_slots() 释放所有已有的关联。
#include <boost/signal.hpp>
#include <iostream> int func1() {
return ;
} int func2() {
return ;
} int main() {
boost::signal<int()> s;
s.connect(func1);
s.connect(func2);
std::cout << s() << std::endl; //缺省情况下,所有被关联的函数中,实际上只有最后一个返回值被返回。
return ;
}
Connections 连接:
connect()方法会返回一个类型为boost::signals::connection的值。
#include <boost/signal.hpp>
#include <iostream> void func() {
std::cout << "Hello, world!" << std::endl;
} int main() {
boost::signal<void()> s;
boost::signals::connection c = s.connect(func);
s();
c.disconnect(); //等价于s.disconnect(func)
return ;
} int main() {
boost::signal<void()> s;
boost::signals::connection c = s.connect(func);
c.block();
s(); //虽然触发,但c已经被block()调用阻塞。
c.unblock(); //unblock()后,func可以被执行。
s();
return 0; //func()只会被调用一次。 boost::signals::scoped_connection c = s.connect(func); 析构时自动释放连接。
}
boost库:事件处理的更多相关文章
- 新手,Visual Studio 2015 配置Boost库,如何编译和选择,遇到无法打开文件“libboost_thread-vc140-mt-gd-1_63.lib“的解决办法
1,到官网下载最新的boost,www.boost.org 这里我下载的1-63版本. 2,安装,解压后运行bootstrap.bat文件.稍等一小会就OK. 3,编译boost库.注意一定要使用VS ...
- vs2013给项目统一配置boost库
1.打开项目,然后点击菜单中的 视图->其他窗口->属性管理器 2. 打开属性管理器,点击项目前的箭头,展开项目,找到debug或者release下面的Microsoft.Cpp.Win3 ...
- [C/C++] C/C++延伸学习系列之STL及Boost库概述
想要彻底搞懂C++是很难的,或许是不太现实的.但是不积硅步,无以至千里,所以抽时间来坚持学习一点,总结一点,多多锻炼几次,相信总有一天我们会变得"了解"C++. 1. C++标准库 ...
- dev c++ Boost库的安装
dev c++ 的boost库的安装步骤 然后点击“check for updates”按钮 最后点击“Download selected”按钮,下载完成后安装.... 给dev添加boost库文件, ...
- vs配置boost库
步骤: 1.在boost官网下载boost版本,以1.59.0为例. 2.解压,解压后可看到文件夹下有个bootstrap.bat文件. 注意: 如果有以下error: 'cl' 不是内部或外部命令, ...
- windows下安装boost库
工作中现在会接触boost,所以我计划两个月之内努力熟悉一下boost.今天在自己win10系统上尝试安装了boost库,下面把遇到的问题总结一下: 1. 下好1.61版本库,在boost目录下运行b ...
- ubuntu 下安装boost库
ubuntu下安装boost库,,在网上试了一些其他人推荐的libboost-dev 但是会缺少,编译程序会报错: /usr/bin/ld: cannot find -lboost_serializa ...
- linux下编译安装boost库
linux下编译安装boost库 linux下编译安装boost库 1.下载并解压boost 1.58 源代码 下载 解压 2.运行bootstrap.sh 3.使用b2进行构建 构建成功的提示 4. ...
- C++ | boost库 类的序列化
是的,这是今年的情人节,一篇还在研究怎么用的文章,文结的时候应该就用成功了. 恩,要有信心 神奇的分割线 不知何时装过boost库的header-only库, 所以ratslam中的boost是可以编 ...
随机推荐
- 【和孩子一起学编程】 python笔记--第五天
关于python2在python3中的改动: https://mp.weixin.qq.com/mp/appmsg/show?__biz=MjM5MDEyMDk4Mw==&appmsgid=1 ...
- Session过期,如何跳出iframe框架页的问题
跳出框架页,实际上是更改父页面地址.那么更改父页面地址很简单即: window.parent.location='/Login/loginindex'; 这里说session过期,那么浏览器端的任何请 ...
- Python实现BFS,DFS
BFS:队 graph = { "A" : ["B","C"], "B" : ["A"," ...
- [CSP-S模拟测试]:Set(随机化)
题目描述 你手上有$N$个非负整数,你需要在这些数中找出一个非空子集,使得它的元素之和能被$N$整除.如果有多组合法方案,输出任意一组即可.注意:请使用高效的输入输出方式避免输入输出耗时过大. 输入格 ...
- 经典JS 判断上传文件大小和JS即时同步电脑时间
我也是新手,还是一个JS笨,有一些网站要实现的功能要自己写么? 答案是不会,去问同事大佬吧,闲简单.就在晚上看了一些其他大佬们写的JS效果, 代码很少.占用网站CPU也小的多.可以一用, 废话少扯.代 ...
- php面试专题---2、常量及数据类型考点
php面试专题---2.常量及数据类型考点 一.总结 一句话总结: 变量为null和变量判断为false的情况需要仔细注意下 1.PHP中字符串可以使用哪三种定义方法以及各自的区别是什么? 单引号:不 ...
- Linux系统结构 详解
Linux系统一般有4个主要部分: 内核.shell.文件系统和应用程序.内核.shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序.管理文件并使用系统.部分层次结构如图1-1所 ...
- Java学习之包
一.包:就是类的命名空间(在文件系统中的表现形式就是文件夹) 二.代码编写规则 1.写在程序文件的第一行 2.格式:package 包名[.包名1.包名2......] 类的全名称 包名.类名 例如: ...
- ubuntu 设置固定IP
vim /etc/network/interface address 要固定的IP地址 netmask 子网掩码 A类地址 默认255.0.0.0 B类地址默 255.255.0.0 ...
- flink-training-course
目录 flink-training-course 大数据领域顶级盛会 Flink Forward Asia 2019 详情