signals2基于Boost的另一个库signals,实现了线程安全的观察者模式。在signals2中,观察者模式被称为信号/插槽(signals and slots),它是一种函数回调机制,一个信号关联了多个插槽,当信号发出时,所有关联它的插槽都会被调用。
下面就通过小案列来实现signal的使用
#include
#include
#include
#include
using namespace std;
class Button{
private:
typedef boost::signals2::signal signalDef;
typedef boost::signals2::signal::slot_type slotType;
private:
signalDef mysignal;
boost::signals2::connection mConnection;
public:
boost::signals2::connection connectFun(const slotType& type){
mConnection = mysignal.connect(type);
return mConnection;
}
void sendSignal(){
mysignal(10,20);
}
};
void fun1(int a, int b){
cout << "add result :" << a + b << endl;
}
void fun2(int a, int b){
cout << "sub result :" << a - b << endl;
}
void fun3(int a ,int b){
cout << "multi result :" << a * b << endl;
}
void main(){
Button button;
boost::signals2::connection con1 = button.connectFun(fun1);
boost::signals2::connection con2 = button.connectFun(fun2);
boost::signals2::connection con3 = button.connectFun(fun3);
//con3.disconnect();
while(1){
system("pause");
button.sendSignal();
}
cin.get();
}
下面槽函数是类的成员函数的时候
#include
#include
#include
#include
using namespace std;
using namespace boost;
template
class Signal{
public:
//typedef 信号
typedef boost::signals2::signal defSignal;
typedef typename defSignal::slot_type defSlot;
public:
//连接槽函数
boost::signals2::connection connectFun(const defSlot& slot);
//重载伪函数
void operator()(typename defSignal::template arg<0>::type a0,typename defSignal::template arg<1>::type a1);
private:
defSignal mSignal;
};
//接收信号后响应的函数
class FunRecv1{
public:
void action(int a, int b){
cout << "add result" << a + b << endl;
}
};
//接收信号后响应的函数
class FunRecv2{
public:
void action(int a, int b){
cout << "multi result" << a * b << endl;
}
};
//实现
template
boost::signals2::connection Signal::connectFun(const defSlot& slot){
return mSignal.connect(slot);
}
template
void Signal::operator()(typename defSignal::template arg<0>::type a0,typename defSignal::template arg<1>::type a1){
mSignal(a0,a1);
}
void main(){
Signal mysignal;
FunRecv1 fun1;
FunRecv2 fun2;
//boost::function myfun = boost::bind(&FunRecv1::action,&fun1,_1,_2);
//信号连接槽函数
boost::signals2::connection con1 = mysignal.connectFun(boost::bind(&FunRecv1::action,&fun1,100,200));
boost::signals2::connection con2 = mysignal.connectFun(boost::bind(&FunRecv2::action,&fun2,11,22));
mysignal(100,200);
con2.disconnect();
mysignal(100,200);
cin.get();
}
到这就能明白signal信号机制的重要性 观察者与被观察者的模式
参考博客:http://www.tuicool.com/articles/ZvYNze