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是可以编 ...
随机推荐
- js append()和appendChild()和insertBefore()的区别
<body> <input type="button" value="删除" id="btn"> <scrip ...
- flask 根路由在蓝图中
- MaxCompute studio FAQ
1. 官方文档地址 https://help.aliyun.com/document_detail/50889.html 2. Show Table Detail 中文乱码 原因是Intellij A ...
- hdu 5120 Intersection (圆环面积相交->圆面积相交)
Problem Description Matt is a big fan of logo design. Recently he falls in love with logo made up by ...
- 多任务Multitask Learning
一次只学习一个任务,大部分机器学习都属于单任务学习. 多任务学习:把多个相关的任务放在一起学习,同时学习多个任务. 对于复杂的问题,可以分解为简单的相互独立的子问题来解决,然后再合并结果,得到最初复杂 ...
- flutter图片组件
在flutter中,image组件有很多构造函数,常用的包括Image.asset(本地图片)和Image.network(远程图片). 常用属性 不管是显示本地图片还是远程图片,image组件都包含 ...
- 3 August
P1013 进制位 结论:加法必为 \(n-1\) 进制:\({(n-1)}^1\) 位必为数字 1:\(0+0=0\). 模拟.字符串. #include <cstdio> #inclu ...
- (转)Windows下安装Docker, GitBash环境配置
转:https://blog.csdn.net/chengly0129/article/details/68944269 官网介绍: https://docs.docker.com/toolbox/t ...
- handler消息机制入门
handler消息机制入门 为什么要用handle? 我们在网络上读取图片信息时,是不能把耗时操作放在主线程里面的,当我们在子线程中获取到了图片的消息的时候,我们就需要把这个数据传给主线程. 而直接使 ...
- 嵌入式C语言3.5 关键字---运算符
1. 算数运算符 + - A +/- B 要求A,B数据类型一致 * 乘法 / 除法 %取模 乘法CPU可能需要多个周期,甚至需要利用软件的模拟方法来实 ...