C++ Boost Signal2 Connection信号与槽函数使用例程

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

下面就通过小案列来实现signal的使用

#include <iostream>
#include <boost\signals2.hpp>
#include <boost\function.hpp>
#include <boost\bind.hpp>
 
using namespace std;
 
 
class Button{
 
private:
    typedef boost::signals2::signal<void(int,int)> signalDef;
    typedef boost::signals2::signal<void(int,int)>::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 <iostream>
#include <boost\signals2.hpp>
#include <boost\bind.hpp>
#include <boost\function.hpp>
 
using namespace std;
using namespace boost;
 
template <typename signature>
class Signal{
 
public:
    //typedef 信号
    typedef boost::signals2::signal<signature> 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 <typename signature>
boost::signals2::connection  Signal<signature>::connectFun(const defSlot& slot){
    return mSignal.connect(slot);
}
 
template <typename signature>
void Signal<signature>::operator()(typename defSignal::template arg<0>::type a0,typename defSignal::template arg<1>::type a1){
    mSignal(a0,a1);
}
void main(){
    
    Signal<void(int,int)> mysignal;
    FunRecv1 fun1;
    FunRecv2 fun2;
 
    //boost::function<void(int,int)> 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信号机制的重要性 观察者与被观察者的模式

参考:https://blog.csdn.net/szqsdq/article/details/71945256?utm_source=copy 
 

猜你喜欢

转载自blog.csdn.net/ljlinjiu/article/details/83068349