知识巩固之boost的Signals2连接方式

知识百科

Signals2是boost里面另一个Signals库,该库实现了线程安全的观察者模式,基于函数回调机制实现信号/槽的绑定和触发事件。引用头文件:#include <boost/signals2.hpp>

说明:该库是线程安全的。

相关:C#语言的event/delegate机制 ;Qt 信号和槽

1. Signals2中连接方式 说明

位置:<boost/signals2/signal.hpp>

// connection management
  connection connect(const slot_type&, connect_position = at_back);
  connection connect(const group_type&, const slot_type&, 
                     connect_position = at_back);

可以看出有几种连接方式,下面通过代码来说明。

1. 1 connection connect(const slot_type&, connect_position = at_back);

#include <iostream>
#include <boost/bind.hpp>
#include <boost/function.hpp>
#include <boost/signals2.hpp>
using namespace std;

void slots1(){
    cout<<"slots1 call"<<endl;
}

void slots2(){
    cout<<"slots2 call"<<endl;
}

struct Hello
{
    Hello() {}
    void operator()()const{
        std::cout<< "Hello world!"<<endl;
    }
};
int main()
{
    boost::signals2::signal<void()> sig1;
    sig1.connect(&slots1);
    sig1.connect(&slots2);
    sig1();
    boost::signals2::signal<void()> sig2;
    sig2.connect(Hello());
    sig2();
    return 0;
}
输出结果:
slots1 call
slots2 call
Hello world!

说明:一般调用connect 是采用默认方式connect_position = at_back ;因此执行结果按照connect设置方式顺序执行。

1.2  connection connect(const group_type&, const slot_type&, connect_position = at_back);

#include <iostream>
#include <boost/bind.hpp>
#include <boost/function.hpp>
#include <boost/signals2.hpp>
using namespace std;
template<int N>
struct  Slot
{
     Slot() {}
     void operator ()(){
         cout<<"Slot num is : " <<N<<endl;
     }
};
int main(){
    boost::signals2::signal<void()>sig;
    sig.connect(Slot<1>(), boost::signals2::at_back);
    sig.connect(Slot<100>(), boost::signals2::at_front);

    sig.connect(2, Slot<40>(),  boost::signals2::at_back);
    sig.connect(2, Slot<50>(), boost::signals2::at_front);

    sig.connect(8, Slot<60>());
    sig();
}
输出结果:
Slot num is : 100
Slot num is : 50
Slot num is : 40
Slot num is : 60
Slot num is : 1

说明: “未命名”插槽(即,未指定组名称已连接的插槽)可以放置在插槽列表的前面或后面(通过传递boost :: signals2 :: at_front或boost :: signals2 :: at_back as 分别连接的最后一个参数),默认为列表的结尾。 指定组时,最后的at_front或at_back参数描述了插槽在组排序中的位置。 与at_front连接的未分组插槽将始终位于所有分组插槽之前。 与at_back连接的未分组插槽将始终接通所有分组插槽。

2. 返回值处理

#include <iostream>
#include <boost/bind.hpp>
#include <boost/function.hpp>
#include <boost/signals2.hpp>
using namespace std;

template<int M>
struct Slot2
{
    Slot2() {}
    int operator ()(int n){
        cout<<"Slot num is : " <<n<<endl;
        return n * M;
    }
};
int main(){
    boost::signals2::signal<int(int)> sig2;
    sig2.connect(Slot2<10>());
    sig2.connect(Slot2<100>());
    cout<<*sig2(30)<<endl;
}
输出结果:
Slot num is : 30
Slot num is : 30
3000

说明:返回类型的信号(float,即赋值给boost :: signals2 :: signal类模板的第一个模板参数)的默认行为是调用所有插槽然后返回 boost :: optional包含被调用的最后一个槽返回的结果。 结果是连接的最后一个插槽。

延伸:

1.disconnect 断开一个或者一组信号槽;disconnect_all_slots断开所以信号槽连接

2.Container容器可以接收多个返回值,可以参考以下连接实例

3.scoped_connection 顾名思义只在该声明的作用域内有效,离开后就会断开。

4.connection是信号和槽连接connect返回的一个句柄。可以用它来判断一些状态等操作。

更多请参考:https://www.boost.org/doc/libs/1_68_0_beta1/doc/html/signals2.html

猜你喜欢

转载自blog.csdn.net/xuqiang918/article/details/81067886