用boost.signal实现多播委托
使用boost.signal
boost.signal提供了一个多播委托机制,通过它可以非常容易的实现观察者模式:
void print_sum(float x, float y)
{
std::cout << "The sum is " << x+y << std::endl;
}
void print_product(float x, float y)
{
std::cout << "The product is " << x*y << std::endl;
}
void print_difference(float x, float y)
{
std::cout << "The difference is " << x-y << std::endl;
}
int main()
{
boost::signal<void (float, float)> sig;
sig.connect(print_sum);
sig.connect(print_product);
sig.connect(print_difference);
sig(5, 3);
}
signal对象的使用方式非常简单,connect连接回调,disonnect去连接回调,()运算符执行所有回调。
连接成员函数
通过lambda表达式也可以非常容易的实现成员函数的连接:
struct A
{
int value;
A(int value) : value(value) {}
void Foo() { cout << "a has value of " << value << endl; }
};
int main()
{
A a(123);
boost::signal<void ()> sig;
sig.connect([&]() {a.Foo();});
sig();
}
连接带返回值的函数
signal也支持带返回值的函数,和C#一样,只返回最后一个函数的返回值。
boost::signal<int ()> sig;
sig.connect([](){ return 1; });
sig.connect([](){ return 2; });
sig.connect([](){ return 3; });
cout << sig() << endl;
异常处理
signal的异常处理机制也和c#一样:遇到异常后停止执行,抛出异常。
sig.connect([](){ cout << "foo 1" << endl; });
sig.connect([](){ throw std::exception("foo 2 fail"); });
sig.connect([](){ cout << "foo 3" << endl; });
try
{
sig();
}
catch (std::exception& error)
{
cout << error.what() << endl;
}
转载于:https://www.cnblogs.com/TianFang/archive/2013/02/04/2891623.html
用boost.signal实现多播委托相关推荐
- 委托、lamda表达式..委托概念-匿名函数-泛型委托-Lamda表达式-多播委托
委托 一.什么是委托? 将一个方法作为参数传递给另一个方法(参数类型为委托delegate). 声明一个委托类型. 委托所指向的函数必须跟委托具有相同的的签名(参数个数.参数类型.返回值一样). ...
- 委托、多播委托(MulticastDelegate)
委托.多播委托(MulticastDelegate) 多播委托(MulticastDelegate)继承自 Delegate ,表示多路广播委托:即,其调用列表中可以拥有多个元素的委托.实际上,我们自 ...
- java委托事件与观察者模式_多播委托与观察者模式联合使用,以及委托与事件的区别...
首先我们先看一下多播委托: 使用委托时,首先我们声明委托,委托语法一共有四种类型,分别时有参,无参,以及有无参数返回值. 1 public class DelegateShow //: System. ...
- 第九节:委托和事件(1)(委托的发展历史、插件式编程、多播委托)
一. 委托的发展历史和基本用法 说起委托,每个人可能都会对他有不同的理解,结合实战中委托的使用,我对其理解是:委托和类一样,是用户的一个自定义类型,委托可以有参数.有返回值,委托的关键字是delega ...
- 多播委托(multicast delegate)
还是老规矩,先看代码:) using System; class MulticastTester { delegate void Greeting(); public sta ...
- 转载-C#委托之多播委托( 二)
通过一个委托调用多个方法可能导致一个大问题,多播委托包含一个逐个调用的委托集合,如果通过委托调用的其中一个方法抛出一个异常,整个迭代就会停止 示例如下:Action为无参委托 static void ...
- C#笔记11多播委托、事件、设计模式(观察者模式)
文章目录 多播委托 初步理解多播委托为委托列表 报社发报案例 增加接口编程改善案例 再用委托类型对上例进行改善 委托链的异常 事件 提供封装,程序更健壮 提供更加抽象的事件用法 System.Even ...
- 很久没上来写点东西了,今天把N年前的代码看了一遍。随手写了点寄托哀思--多播委托...
using System; // 委托类似于C++中的函数指针,不同的是委托可以包含一个顺序的委托集合. // 在C#类型封装中,对于不同类型的单个函数的暴露建议使用委托而不要使用接口. // 委托 ...
- C#委托,多播委托,匿名委托,事件
委托 委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递.事件是一种特殊的委托. 委托是方法的抽象,它存储的就是一系列具有相同签名和返回类型的方法的地址.调用委托的时候,委 ...
最新文章
- 复习04统计学习方法(朴素贝叶斯算法Naive Bayes)---图片版
- 服务器-番外篇-搭建samba共享
- ddr5内存上市时间_辣评烩:SK海力士首发DDR5内存:频率冲上5600MHz
- 怎样取消Windows 2003 server 意外关机提示
- 《剑指offer》字符串的排列
- 脚本应用实例_Selenium自动化中无头浏览器的应用
- ajax js java省市三级联动菜单,AJAX省市区三级联动下拉菜单(java版)
- ubuntu meld比较文件差异
- bzoj1974 [Sdoi2010]代码拍卖会 循环+背包
- Python版冒泡法排序算法
- oracle ocr掉盘,恢复OCR磁盘组一则
- 如何用EasyRecovery找回删除的文档(附注册机下载地址)
- 浪潮服务器怎么获取cpu信息,浪潮获取cpu、内存、硬盘等信息(redfish协议+restfull协议)...
- 一分钟详解智能快递柜锁控板方案和原理
- 黑魂3无法从服务器获取信息,黑魂3怎么读取信息 | 手游网游页游攻略大全
- abs和pc混在一起怎么解决_PC和ABS塑料使用中常见问题的分析及其解决办法
- 【科学文献计量】networkx绘制网络图的基本属性,图形读写以及无向/有向图形绘制详解
- 小巧舒适佩戴稳定蓝牙耳机推荐,2020双11高性价比蓝牙耳机,机不可失
- TI单芯片毫米波雷达1642代码走读(〇)——总纲
- 测试理论-测试用例设计 (一) --- 正交表分析法
热门文章
- JZOJ 3129. 【WinterCamp 2013】数三角形
- python 堆栈溢出_python - 使用CFFI释放内存时,“ MemoryError:堆栈溢出”是什么意思? - 堆栈内存溢出...
- c malloc 头文件_C语言提高篇_malloc,realloc和calloc的区别
- c语言用数组发送大写字母怎么读,c语言字符数组大小写转换
- C语言——球体体积判断素数用递归计算Fibonacci数列
- pythonmax对字符_(MAX第五篇)Python--字符串操作(三)
- Python-函数递归调用
- Java Integer于Int 进行==双等于的内存比较时的一些问题说明
- 通过 Java 线程堆栈进行性能瓶颈分析
- 如何修改容器的一些参数