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);
}