boost::signal2 信号/插槽(线程安全的观察者模式)

signals2基于Boost的另一个库signals,实现了线程安全的观察者模式。在signals2中,观察者模式被称为信号/插槽(signals and slots),它是一种函数回调机制,一个信号关联了多个插槽,当信号发出时,所有关联它的插槽都会被调用。

signals2位于名字空间 boost::signals2 ,头文件<boost/signals2.hpp>,即:

#include <boost/signals2.hpp>
using namespace boost::signals2;

示例代码:


#include <boost/signals2.hpp>
using namespace boost::signals2;


#include <iostream>
using std::cout;
using std::endl;

void slots1()
{
    cout << "slot1 called" << endl;
}
void slots2()
{
    cout << "slot2 called" << endl;
}

template<int N>
class Slot
{
public:
    int operator()(int x){
        cout << "slot " << N << " called" << endl;
        return N * x;
    }
};

void signals2_test()
{
    signal<void()> sig;  //一个信号插槽对象
    sig.connect(&slots1);  //连接插槽1,&可要可不要
    connection c2=sig.connect(slots2,signals2::at_front);  //signals2::at_front标志slots2先被调用
    sig();  //调用operator(),产生信号(事件),触发插槽调用
    sig.disconnect(slots1);  //断开插槽slots1
    sig();
    c2.disconnect();
    //shared_connection_block block(c2);  //暂时阻塞插槽
    //do something
    //block.unblock();  //解除阻塞
    sig();



    signal<int(int)> sig2;
    sig2.connect(Slot<5>());
    sig2.connect(1,Slot<15>());  //1代表插槽组号
    sig2.connect(1,Slot<35>());
    int result=*sig2(2);  //返回最后一个插槽的返回值
    cout << result << endl;
    sig2.disconnect(1);  //断开插槽组的连接
    sig2(2);
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值