C++信号槽sigslot的无脑接入

本文介绍了sigslot库,一个用于C++的信号槽解决方案,它简化了非GUI部分的事件处理,无需外部依赖。文章重点讲解了如何使用、优势与局限,并通过实例展示了如何定义信号、槽函数及它们之间的关联和通信。
摘要由CSDN通过智能技术生成

背景

Qt的信号槽是常用的,但是对于非GUI的部分,最好还是用纯C++的好些,毕竟如果需要将现有的代码直接作为SDK给第三方公司同事使用,还是纯C++的好些。基于此,了解到C++的一个信号槽类库——sigslot。

sigslot的优势

  1. 仅需要include其头文件即可,无需lib、dll文件
  2. 使用方便
    • 定义信号
    • 定义槽函数 //实现槽的类必须继承has_slots<>
    • 关联信号和槽函数
    • 发送信号
    • 断开信号
  3. 发送未connect的信号不会报错

sigslot的劣势

  1. 信号传递的参数数量有限(0-8个),
    • 当然8个参数绝可以应对绝大多数场景,如果传递的参数过多时,需要考虑是否可以封装,封装成stuct、Class
  2. 槽函数的返回值为void

talk is cheap, show me the code

#include <iostream>
#include "sigslot.h"

using namespace sigslot;

struct People
{
	int age;
	std::string name;
};
	   
class Switch
{
public:
	signal0<>  sig_turnOn;
	signal1<std::string> sig_SendText;
	signal1<struct People> sig_SendPeople;//测试发送结构体,以应对参数过多的情景
};

class Light : public has_slots<>
{
public:
	void slot_TurnOn()
	{
		std::cout << "the light is on\n";
	}

	void slot_ReceiveText(std::string s)
	{
		std::cout << "received message :"<<s <<"\n";
	}

	void slot_receivePeople(struct People p)
	{
		std::cout << "received People, age = "<<p.age<<" name = "<<p.name << "\n";
	}
};


int main(int argc, char *argv[])
{
	Light light;
	Switch sw;
	sw.sig_turnOn.connect(&light, &Light::slot_TurnOn);//关联信号
	sw.sig_turnOn();//发送信号
	sw.sig_turnOn.emit();//发送信号的另一种方式
	


	sw.sig_SendText.connect(&light, &Light::slot_ReceiveText);
	sw.sig_SendText("hello world");//发送信号
	sw.sig_SendText.emit("hello sigslot");//发送信号的另一种方式

	std::cout << "disconnect clicked signal before" << std::endl;
	sw.sig_turnOn.disconnect(&light);//断开信号连接
	sw.sig_turnOn.emit();//此时发送信号不会报错
	std::cout << "disconnect clicked signal end" << std::endl;

	sw.sig_turnOn.connect(&light, &Light::slot_TurnOn);//再次关联信号
	sw.sig_turnOn.emit();

	sw.sig_turnOn.disconnect_all();//断开所有与该信号关联的槽函数

	sw.sig_SendPeople.connect(&light, &Light::slot_receivePeople);
	People p{ 18,"sunny" };
	sw.sig_SendPeople(p);


	system("pause");

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值