boost的signal和solt机制使用入门
signal-slot是一个非常方便的接口机制,在Qt和Gtk中广泛使用。boost也实现了一个signal-slot机制。
编译包含signal-slot的代码
使用signal-slot,必须包含头文件
#include <boost/signal.hpp>
signal-slot在boost中不是纯头文件,需要一个libboost_signals.so文件,在编译时,需要
g++ -o signal2 signal2.cpp -l boost_signals
初见signal-slot
从HelloWorld开始吧
首先定义hellword函数
void helloworld() {
std::cout << "Hello, World!(func)" << std::endl;
}
然后,定义signal对象
boost::signal<void ()>sig;
在main函数中使用
int main()
{
sig.connect(&helloworld);
sig();
}
sig()相当与emit。
除了直接的对象外,还可以使用函数对象
struct HelloWorld {
void operator() () const
{
std::cout << "Hello, World!" << std::endl;
}
};
在main函数中,这样使用
HelloWorld hello;
sig.connect(hello);
还可以使用bind,(请#include <boost/bind.hpp>)
void printMore(const std::string& user)
{
std::cout << user << " say: Hello World!\n";
}
在main函数中,这样使用
sig.connect(boost::bind(printMore, “Tom”));
sig.connect(boost::bind(printMore, “Jerry”));
打印的结果是
Tom say: Hello World!
Jerry say: Hello World!
singal-slot的顺序
默认情况下,signal-slot是按照添加顺序进行的,例如
struct Hello {
void operator() () const
{
std::cout << "Hello ";
}
};
struct World {
void operator() () const
{
std::cout << ", World" << std::endl;
}
};
如果这样写
sig.connect(Hello());
sig.connect(World());
输入的结果是
Hello , World
先调用了Hello,后调用了World
但是,如果这样写
sig.connect(1, World());
sig.connect(0, Hello());
结果仍然同上面的一样。
signal connection的管理
disconnection
signal disconnect方法
sig.connect(&helloworld);
…
sig.connect(&helloworld);
目前发现的只有函数可以这样做,函数对象,bind对象都不可以。
connection对象的disconnect方法
HelloWorld hello;
boost::signals::connection c = sig.connect(hello);
…
c.disconnect();