Boost.Signals简介

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 
<< "void my_first_slot() ";
}


class  my_second_slot  {
public:
  
void operator()() const {
    std::cout 
<<
      
"void my_second_slot::operator()() const ";
  }

}
;

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

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

  std::cout 
<< "Emitting a signal... ";
  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的专栏

你可能感兴趣的:(设计模式,lambda,iostream,Signal,events,delegates)