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); 析构时自动释放连接。
}