Boost.Signals简介

本文介绍了Boost.Signals库的实现原理及应用案例,该库在C++中优雅地解决了回调问题,实现了信号与插槽机制。文章通过一个示例程序展示了如何使用Boost.Signals连接和发射信号。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Boost.Signals简介

Boost.Signals实现了signals/slots模式,信号(signals)被发射,而插槽(slots)接收该信号。它还有另外一些名字:Observer, publisher/subscriber, events (和 event targets),这些指的都是一些信息源和对这些信息的变化感兴趣的实例之间的一对多关系。

这种设计模式最常见的使用是在GUI中,使特定动作(例如,用户单击了一个按钮)与其它动作(按钮改变它的外观,执行某个商业逻辑)松散连接。

一些编程语言已经在语言中直接实现了这种机制,如 .NET 中的delegates 和 events。在C++标准库中没有用于回调的工具,但这个问题被Boost.Signals库优美地解决了。


使用简例

#include < iostream >
#include
" boost/signals.hpp "

void my_first_slot() ... {
std::cout
<<"voidmy_first_slot() ";
}


class my_second_slot ... {
public:
voidoperator()()const...{
std::cout
<<
"voidmy_second_slot::operator()()const ";
}

}
;

int main() ... {
boost::signal
<void()>sig;

sig.connect(
&my_first_slot);
sig.connect(my_second_slot());

std::cout
<<"Emittingasignal... ";
sig();
}


运行这个程序,输出信息如下:

Emitting a signal...
void my_first_slot()
void my_second_slot::operator()() const

但是后两行的顺序不一定是这样的,你必须用不同的组来控制调用顺序:

sig.connect(1, &my_first_slot);
sig.connect(2, my_second_slot());

在上例中已经看到,signal的第一模板参数是被调用的函数的签名。
connect 函数把插槽 s 连接到 signal. 函数指针、函数对象、bind 表达式或者 lambda 表达式都可以用作插槽。connect 返回一个 signals::connection, 它是代表被创建的连接的句柄。通过使用这个句柄,插槽可以从 signal 断开,或者你也可以测试该插槽是否还有连接。

一个 connect 的重载版本可把插槽 s 连接到组 g,默认的组类型是int。

signals可以带参数,有返回值,默认为最后一个插槽的返回值。


摘自: alai04的专栏
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值