Boost库信号槽机制的简单使用

Boost库信号机制介绍

什么是boost库以及其中的信号机制

boost库是一个功能强大,构造精巧,跨平台的免费的C++开源库。它使得C++编程更优雅(划重点)、更有活力、更高产,C++11的标准有三分之二来自boost库。(百度的,反正个人感觉就是boost库非常封装了很多非常好用的模块,比如时间模块,线程模块,log日志模块对“秃头哥”的我们来说非常友好)
在实际的开发过程中,类似于Qt信号槽的机制有着非常广泛的应用,在c++的boost库中提供了signal和signals,signals2基于signal实现并且线程安全,下面介绍一下一般比较常见的使用。

环境的安装

	安装命令sudo apt-get install libboost-dev

信号的定义

首先我们在sig.h里面定义两个信号

#define _SIG_H_
#include <boost/signals2.hpp>
#include <iostream>
using namespace std;
using namespace boost::signals2;

//信号的定义
//注意!signal里面的参数要和调用的函数的形参和返回值类型对应上,不然就会报错
signal<string()> sig1;
signal<int(int)> sig2;

#endif

槽函数

然后我们在另一个.cpp文件里写几个槽函数

#include "Sig.h"

/*signals2基于Boost里另一个库signals实现了线程安全的观察者模式。
signal中一个比较重要的操作函数是connect,它把插槽连接到信号上;
插槽可以是任意可调用对象,包括函数指针、函数对象,以及他们的bind/lambda函数。
connect函数将返回一个connection对象,表示了信号和插槽之间的连接关系,
connection对象可以更灵活的处理信号与槽函数的连接、断开等关系。*/

//普通槽函数
string slot_first()
{
    cout << "slot 1 called!" << endl;
    return "slot1";
}

string slot_second()
{
    cout << "slot 2 called!" << endl;
    return "slot2";
}

int slot_third(int x)
{
    cout << "slot Third called!" << endl;
    return x;
}

int main(int argc, char const *argv[])
{
    
    sig1.connect(slot_first);
    sig1.connect(slot_second);
	//如果不指定信号就会按照绑定的顺序调用
    sig1();
    
    cout << "===================" << endl;
    sig1.connect(2,slot_first);
    sig1.connect(1,slot_second);
    sig1();//指定之后会按照指定的先后调用
    cout << "===================" << endl;
	//在这里我们会看到sig1和sig2的信号类型不一样,如果用slot_third绑定sig1就会报错同理 
	//slot_first绑定sig2也会报错,因为他们的信号类型不一样,一个是string(),一个是int(int)
	//这种机制为我们使用信号槽提供了很大的便利,开发人员写的时候就要很小心的注意哪个信号和哪个槽绑定避免错误
    sig2.connect(slot_third);
	//绑定lambda函数,在项目中非常常用,消耗资源会非常少
    sig2.connect(
        [](int num){
            cout << "lambda called!" <<endl;
            return num;
        }
    );
    sig2(666);
	//对于信号的调用的话注意形参要传对类型哦
    
    system("pause");
    return 0;
}

调用以及结果分析

让我们来分析一下结果吧

slot 1 called!
slot 2 called!
===================
//很明显的差别发现绑定了顺序了之后,第一次slot1先调用,slot2在第二次会先调用
slot 2 called!
slot 1 called!
slot 1 called!
slot 2 called!
===================
slot Third called!
lambda called!
//这里lambda函数调用之后就释放了,非常节约资源大家赶紧再项目中灵活运用起来吧!

结束语

这次就简单的介绍一下用法,后面会继续跟大家介绍信号槽机制在项目中有哪些神操作,能和其他库产生什么样奇妙的化学反应(小声bb:本菜鸡也还在研究当中T T)

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Boost使用案例可以通过以下步骤进行: 1. 下载和安装Boost:首先,你需要从Boost官方网站下载并解压Boost的压缩包[1]。然后,进入解压后的目录,并执行bootstrap.sh脚本来配置Boost的编译选项[3]。最后,使用b2命令编译并安装Boost[3]。 2. 包含头文件:大多数Boost只需要在你的源代码中包含相应的头文件即可[2]。例如,如果你想使用boost::tribool,只需要在你的C源文件中添加以下include语句: ```cpp #include <boost/XXX.hpp> #include <boost/logic/tribool.hpp> //使用tribool ``` 3. 使用Boost:一旦你包含了所需的头文件,你就可以使用Boost提供的功能了。你可以根据你的需求使用不同的Boost组件,比如算法、时间处理、异步并发等[1]。 下面是一个使用Boost简单示例,展示了如何使用boost::tribool来处理三态逻辑值: ```cpp #include <iostream> #include <boost/logic/tribool.hpp> int main() { boost::logic::tribool value = boost::logic::indeterminate; // 初始化为不确定状态 if (value) { std::cout << "Value is true" << std::endl; } else if (!value) { std::cout << "Value is false" << std::endl; } else { std::cout << "Value is indeterminate" << std::endl; } return 0; } ``` 在这个示例中,我们使用boost::logic::tribool来定义一个三态逻辑值。我们将其初始化为不确定状态,并根据其值输出相应的信息。 希望这个示例能帮助你理解如何使用Boost。你可以根据自己的需求选择合适的Boost组件,并在你的代码中包含相应的头文件来使用它们[1][2]。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值