boost库:事件处理

boost库的signal所实现的模式被命名为信号至插槽,当对应的信号被发出时,相关联的插槽即被执行。

#include <boost/signal.hpp>
#include <iostream>

void func() {
  std::cout << "Hello, world!" << std::endl;
}

int main() {
  boost::signal<void()> s;
  s.connect(func);
  s();
  return 0;
}

boost::signal被实现为一个模板函数,具有被用作为事件处理器的函数的签名,该签名也是它的模板参数。上例中,只有签名为void()的函数才可以被成功关联至信号s。当信号s被触发时,func函数被调用。

上述例子也可以使用boost.function来实现:

#include <boost/function.hpp>
#include <iostream>

void func() {
  std::cout << "Hello, world!" << std::endl;
}

int main() {
  boost::function<void()> f;
  f = func;
  f();
  return 0;
}

但signals可以关联多个函数至单个信号,如下:

#include <boost/signal.hpp>
#include <iostream>

void func1() {
  std::cout << "Hello" << std::flush;
}

void func2() {
  std::cout << ", world!" << std::endl;
}

int main() {
 boost::signal<void()> s;
 s.connect(func1);
 s.connect(func2);
 s();
 return 0;
}

boost::signal可以通过反复调用connect()方法来把多个函数赋值给单个特定信号。当该信号被触发时,这些话函数按照之前用connect()关联的顺序来执行。执行顺序也可以通过connect()方法的另一个重载版本来明确指定,如s.connect(1, func2); s.connect(0, func1)

释放关联,使用disconnect()方法,s.disconnect(func2)。

s.num_slots() 返回已关联函数的数量。

s.empty() 是否关联函数。

s.disconnect_all_slots() 释放所有已有的关联。

#include <boost/signal.hpp>
#include <iostream>

int func1() {
  return 1;
}

int func2() {
  return 2;
}

int main() {
  boost::signal<int()> s;
  s.connect(func1);
  s.connect(func2);
  std::cout << s() << std::endl; //缺省情况下,所有被关联的函数中,实际上只有最后一个返回值被返回。
  return 0;
}

Connections 连接:

connect()方法会返回一个类型为boost::signals::connection的值。

#include <boost/signal.hpp>
#include <iostream>

void func() {
  std::cout << "Hello, world!" << std::endl;
}

int main() {
  boost::signal<void()> s;
  boost::signals::connection c = s.connect(func);
  s();
  c.disconnect(); //等价于s.disconnect(func)
  return 0;
}

int main() {
boost::signal<void()> s;
boost::signals::connection c = s.connect(func);
c.block();
s(); //虽然触发,但c已经被block()调用阻塞。
c.unblock(); //unblock()后,func可以被执行。
s();
return 0; //func()只会被调用一次。

  boost::signals::scoped_connection c = s.connect(func); 析构时自动释放连接。
}
原文地址:https://www.cnblogs.com/sssblog/p/10251011.html