博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用boost.signal实现多播委托
阅读量:5278 次
发布时间:2019-06-14

本文共 1319 字,大约阅读时间需要 4 分钟。

使用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

你可能感兴趣的文章
mysql启动过程
查看>>
2017前端面试题总结
查看>>
Http GetPost网络请求
查看>>
SWIFT国际资金清算系统
查看>>
Sping注解:注解和含义
查看>>
站立会议第四天
查看>>
如何快速掌握一门技术
查看>>
利用AMPScript获取Uber用户数据的访问权限
查看>>
vagrant 同时设置多个同步目录
查看>>
python接口自动化28-requests-html爬虫框架
查看>>
生成随机数的模板
查看>>
Mysql 数据库操作
查看>>
转:linux终端常用快捷键
查看>>
UVa 11059 最大乘积
查看>>
数组分割问题求两个子数组的和差值的小
查看>>
composer 报 zlib_decode(): data error
查看>>
hdu 3938 并查集
查看>>
《深入分析Java Web技术内幕》读书笔记之JVM内存管理
查看>>
python之GIL release (I/O open(file) socket time.sleep)
查看>>
软件开发与模型
查看>>