boost的signal和solt机制使用入门

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();  

猜你喜欢

转载自blog.csdn.net/qq_23350817/article/details/103227482