Sigslot

Sigslot是一个基于C++的信号槽库,它是一个头文件库,线程安全,在Boost.Signals2的基础上进行了改进。

Sigslot具有以下特点:

  • 线程安全;
  • 自动追踪对象生命周期,自动断开槽连接(可通过ADL进行扩展);
  • 使用RAII进行连接管理;
  • 支持槽组,以确保槽按顺序执行;
  • 实现简单明了,性能合理。

Sigslot经过单元测试,可靠稳定,可以替代Boost Signals2。

在地址、线程和未定义行为检测器下,测试运行良好。

许多实现允许信号返回值,但Sigslot不支持,因为我个人没有使用的需求。如果有说服我的理由,我可能会改变主意。

安装

Sigslot无需编译或安装,只需要包含sigslot/signal.hpp头文件即可使用。Sigslot目前依赖于符合C++14标准的编译器,但如果有需要,可以进行适配以支持C++11。已知在GNU Linux上使用Clang 4.0和GCC 5.0+编译器、在Windows上使用MSVC 2017及更高版本、Clang-cl和MinGW编译器均可正常工作。

然而,在Windows上使用MSVC和Clang-Cl编译器时可能会遇到一个问题,可能需要在特殊情况下使用/OPT:NOICF链接器标志。详细信息请参阅《实现细节》章节。

提供了一个用于安装的CMake列表文件,以及生成CMake导入模块。这是首选的安装方法。Pal::Sigslot导入目标已经可用,并已应用所需的链接器标志。示例和测试需要依赖Qt5和Boost进行适配器单元测试,也需要使用该导入目标。

 
 

cmakeCopy Code

# 使用CMake使用Sigslot find_package(PalSigslot) add_executable(MyExe main.cpp) target_link_libraries(MyExe PRIVATE Pal::Sigslot)

在配置过程中,可以使用SIGSLOT_REDUCE_COMPILE_TIME选项。启用后,它会尝试通过避免对std::make_shared的调用产生的重型模板实例化来减少代码膨胀。默认情况下,此选项关闭,但可以激活,以便喜欢更小的代码大小和编译时间,即以稍微降低效率为代价。

扫描二维码关注公众号,回复: 15542546 查看本文章

可以使用以下指令从根目录进行安装:

mkdir build && cd build
cmake .. -DSIGSLOT_REDUCE_COMPILE_TIME=ON -DCMAKE_INSTALL_PREFIX=~/local
cmake --build . --target install

# 如果要编译示例:
cmake --build . --target sigslot-examples

# 编译/执行单元测试:
cmake --build . --target sigslot-tests

CMake FetchContent

还可以使用FetchContent方法集成Pal::Sigslot

include(FetchContent)

FetchContent_Declare(
  sigslot
  GIT_REPOSITORY https://github.com/palacaze/sigslot
  GIT_TAG        19a6f0f5ea11fc121fe67f81fd5e491f2d7a4637 # v1.2.0
)
FetchContent_MakeAvailable(sigslot)

add_executable(MyExe main.cpp)
target_link_libraries(MyExe PRIVATE Pal::Sigslot)

文档

Sigslot实现了在UI框架中流行的信号槽机制,使得使用观察者模式或基于事件的编程变得简单。该库的主要入口点是sigslot::signal<T...>类模板。

信号是一个可以发出带有类型的通知的对象,真正的值是根据信号类模板参数进行参数化的,并且可以注册任意数量的通知处理器(可调用对象),这些处理器具有兼容的参数类型,以便在发生信号发射时使用提供的值执行。在信号-槽术语中,这被称为将一个槽连接到一个信号上,其中"槽"表示可调用实例,而"连接"可以被视为从信号到槽的概念性链接。

下面是一个展示库最基本功能的示例。

首先声明一个无参数的信号sig,然后连接多个槽,最后发出一个信号,触发之前连接的每个可调用槽的调用。注意库如何处理各种形式的可调用对象。

猜你喜欢

转载自blog.csdn.net/huapeng_guo/article/details/131460854