当前位置: 首页 > news >正文

boost之signal的封装及使用例子

封装: 

#ifndef SIGNAL_H
#define SIGNAL_H#include <boost/signals2.hpp>
#include <functional>
#include <mutex>template<typename Signature>
class Signal {
public:using SignalType = boost::signals2::signal<Signature>;using SlotType = typename SignalType::slot_type;using Connection = boost::signals2::connection;using ScopedConnection = boost::signals2::scoped_connection;Signal() = default;~Signal() = default;Signal(const Signal&) = delete;Signal& operator=(const Signal&) = delete;Signal(Signal&&) = delete;Signal& operator=(Signal&&) = delete;// 连接槽函数Connection connect(const SlotType& slot) {std::lock_guard<std::mutex> lock(mutex_);return signal_.connect(slot);}// 作用域连接(自动管理生命周期)ScopedConnection connect_scoped(const SlotType& slot) {std::lock_guard<std::mutex> lock(mutex_);return ScopedConnection(signal_.connect(slot));}// 断开连接(无锁优化)void disconnect(Connection conn) {conn.disconnect();}// 断开所有连接void disconnect_all() {std::lock_guard<std::mutex> lock(mutex_);signal_.disconnect_all_slots();}// 线程安全的信号发射template<typename... Args>void emit(Args&&... args) {SignalType tmp;{std::lock_guard<std::mutex> lock(mutex_);tmp = signal_;  // 复制槽列表}tmp(std::forward<Args>(args)...);  // 在锁外执行}// 获取连接数size_t connection_count() const {std::lock_guard<std::mutex> lock(mutex_);return signal_.num_slots();}private:SignalType signal_;mutable std::mutex mutex_;
};#endif // SIGNAL_H

例子:

#include <iostream>
#include <string>
#include "Signal.h"using MySignal = Signal<void(int, const std::string&)>;void freeFunction(int a, const std::string& str) {std::cout << "[FreeFunction] a=" << a << ", str=" << str << std::endl;
}class MyClass {
public:void memberFunction(int a, const std::string& str) {std::cout << "[MyClass::memberFunction] a=" << a << ", str=" << str << std::endl;}
};int main() {MySignal signal;// 连接自由函数auto conn1 = signal.connect(&freeFunction);MyClass obj;// 连接成员函数auto conn2 = signal.connect(std::bind(&MyClass::memberFunction, &obj, std::placeholders::_1, std::placeholders::_2));// 连接lambda,使用作用域连接自动断开{auto scopedConn = signal.connect_scoped([](int a, const std::string& str) {std::cout << "[Lambda Scoped] a=" << a << ", str=" << str << std::endl;});std::cout << "连接数: " << signal.connection_count() << std::endl;// 发送信号signal.emit(10, "Hello World");// scopedConn 离开作用域后自动断开}std::cout << "连接数(lambda断开后): " << signal.connection_count() << std::endl;// 再次发送信号,lambda槽不会被调用signal.emit(20, "After Scoped Disconnect");// 手动断开自由函数连接signal.disconnect(conn1);std::cout << "连接数(自由函数断开后): " << signal.connection_count() << std::endl;// 发送信号,只剩成员函数槽被调用signal.emit(30, "Only Member Function");// 断开所有连接signal.disconnect_all();std::cout << "连接数(全部断开后): " << signal.connection_count() << std::endl;// 发送信号,不会有任何输出signal.emit(40, "No listeners");return 0;
}

 

http://www.xdnf.cn/news/1042255.html

相关文章:

  • 数列求和计算
  • XCTF-misc-János-the-Ripper
  • C++斯特林数在C++中的数学理论与计算实现1
  • 飞牛NAS本地化部署Dify打造私有LLMOps平台
  • CARSIM-制动压力与制动踏板行程关系
  • acm模式stringstream
  • 滚珠螺杆的预紧间隙如何调整?
  • 大模型量化与剪枝
  • 无监督的预训练和有监督任务的微调
  • 源端串联端接
  • 【八股消消乐】构建微服务架构体系—实现制作库与线上库分离
  • 图的遍历模板
  • Linux【8】-----Linux系统编程(并发编程原理与应用)
  • YOLO系列对指定图片绘制模型热力图
  • Day.31
  • 从0到1开发一个自己的工具 MCP 并发布到 test PyPi(Python个人版)
  • 代码审计服务:如何解决误报与漏报难题,保障软件安全?
  • 从MVC到MVVM:从过程式走向声明式
  • 14:00开始面试,14:06就出来了,问的问题有点变态。。。
  • 谷歌“Find Hub”,携UWB、卫星连接、行李追踪三大功能强势挑战苹果“查找”
  • 渲染学进阶内容——机械动力的渲染系统(2)
  • 【DSP笔记 · 第4章】算法的奇迹:快速傅里叶变换(FFT)如何改变世界
  • LangGraph基础知识(Store )(四)
  • 3.1.3_栈的链式存储实现
  • MCP前后端技术研究和应用实践
  • 细聊工业级网络变压器在不同行业中的浪涌等级选型应用
  • QEMU源码全解析 —— 块设备虚拟化(30)
  • 广东省省考备考(第二十八天6.13)—资料分析(第二节课)
  • 【无标题】定制园区专属地图:如何让底图只显示道路和地面?
  • Relook:softmax函数