使用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实现多播委托相关推荐

  1. 委托、lamda表达式..委托概念-匿名函数-泛型委托-Lamda表达式-多播委托

    委托 一.什么是委托? 将一个方法作为参数传递给另一个方法(参数类型为委托delegate).   声明一个委托类型. 委托所指向的函数必须跟委托具有相同的的签名(参数个数.参数类型.返回值一样). ...

  2. 委托、多播委托(MulticastDelegate)

    委托.多播委托(MulticastDelegate) 多播委托(MulticastDelegate)继承自 Delegate ,表示多路广播委托:即,其调用列表中可以拥有多个元素的委托.实际上,我们自 ...

  3. java委托事件与观察者模式_多播委托与观察者模式联合使用,以及委托与事件的区别...

    首先我们先看一下多播委托: 使用委托时,首先我们声明委托,委托语法一共有四种类型,分别时有参,无参,以及有无参数返回值. 1 public class DelegateShow //: System. ...

  4. 第九节:委托和事件(1)(委托的发展历史、插件式编程、多播委托)

    一. 委托的发展历史和基本用法 说起委托,每个人可能都会对他有不同的理解,结合实战中委托的使用,我对其理解是:委托和类一样,是用户的一个自定义类型,委托可以有参数.有返回值,委托的关键字是delega ...

  5. 多播委托(multicast delegate)

    还是老规矩,先看代码:) using System; class MulticastTester {     delegate void Greeting();          public sta ...

  6. 转载-C#委托之多播委托( 二)

    通过一个委托调用多个方法可能导致一个大问题,多播委托包含一个逐个调用的委托集合,如果通过委托调用的其中一个方法抛出一个异常,整个迭代就会停止 示例如下:Action为无参委托 static void ...

  7. C#笔记11多播委托、事件、设计模式(观察者模式)

    文章目录 多播委托 初步理解多播委托为委托列表 报社发报案例 增加接口编程改善案例 再用委托类型对上例进行改善 委托链的异常 事件 提供封装,程序更健壮 提供更加抽象的事件用法 System.Even ...

  8. 很久没上来写点东西了,今天把N年前的代码看了一遍。随手写了点寄托哀思--多播委托...

    using  System; // 委托类似于C++中的函数指针,不同的是委托可以包含一个顺序的委托集合. // 在C#类型封装中,对于不同类型的单个函数的暴露建议使用委托而不要使用接口. // 委托 ...

  9. C#委托,多播委托,匿名委托,事件

    委托 委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递.事件是一种特殊的委托. 委托是方法的抽象,它存储的就是一系列具有相同签名和返回类型的方法的地址.调用委托的时候,委 ...

最新文章

  1. 复习04统计学习方法(朴素贝叶斯算法Naive Bayes)---图片版
  2. 服务器-番外篇-搭建samba共享
  3. ddr5内存上市时间_辣评烩:SK海力士首发DDR5内存:频率冲上5600MHz
  4. 怎样取消Windows 2003 server 意外关机提示
  5. 《剑指offer》字符串的排列
  6. 脚本应用实例_Selenium自动化中无头浏览器的应用
  7. ajax js java省市三级联动菜单,AJAX省市区三级联动下拉菜单(java版)
  8. ubuntu meld比较文件差异
  9. bzoj1974 [Sdoi2010]代码拍卖会 循环+背包
  10. Python版冒泡法排序算法
  11. oracle ocr掉盘,恢复OCR磁盘组一则
  12. 如何用EasyRecovery找回删除的文档(附注册机下载地址)
  13. 浪潮服务器怎么获取cpu信息,浪潮获取cpu、内存、硬盘等信息(redfish协议+restfull协议)...
  14. 一分钟详解智能快递柜锁控板方案和原理
  15. 黑魂3无法从服务器获取信息,黑魂3怎么读取信息 | 手游网游页游攻略大全
  16. abs和pc混在一起怎么解决_PC和ABS塑料使用中常见问题的分析及其解决办法
  17. 【科学文献计量】networkx绘制网络图的基本属性,图形读写以及无向/有向图形绘制详解
  18. 小巧舒适佩戴稳定蓝牙耳机推荐,2020双11高性价比蓝牙耳机,机不可失
  19. TI单芯片毫米波雷达1642代码走读(〇)——总纲
  20. 测试理论-测试用例设计 (一) --- 正交表分析法

热门文章

  1. JZOJ 3129. 【WinterCamp 2013】数三角形
  2. python 堆栈溢出_python - 使用CFFI释放内存时,“ MemoryError:堆栈溢出”是什么意思? - 堆栈内存溢出...
  3. c malloc 头文件_C语言提高篇_malloc,realloc和calloc的区别
  4. c语言用数组发送大写字母怎么读,c语言字符数组大小写转换
  5. C语言——球体体积判断素数用递归计算Fibonacci数列
  6. pythonmax对字符_(MAX第五篇)Python--字符串操作(三)
  7. Python-函数递归调用
  8. Java Integer于Int 进行==双等于的内存比较时的一些问题说明
  9. 通过 Java 线程堆栈进行性能瓶颈分析
  10. 如何修改容器的一些参数