为什么使用信号槽
为了解耦,因为建设一定规模的程序时,为了未来的可维护性扩展性,使用信号槽是个不错的想法。
好比某道菜可能有多个方法去制作,所以我们在炒制的地方标注根据客人需求制作,这样就不至于客人需求不一样时就需要给厨师一份新的菜谱为了替换菜谱上的某个小地方,这样实现了解耦。
使用的库
我们这里使用boost的信号槽库,安装boost库后可以包含以下来使用库中的方式实现功能。
#include <boost/signals2.hpp>
例程
#include <iostream>
#include <boost/signals2.hpp>
using namespace boost::signals2;
typedef signal<void(int, int)> vi_sig;
vi_sig sig2;
void slots1() {
std::cout << "slot 1 called" << std::endl;
}
void slots2(int a, int b, int c) {
std::cout << "slot 2 get a " << a
<< " get b " << b
<< " get c " << c << std::endl;
}
void SetEventDataReceived(slot<void(int, int)> func)
{
sig2.connect(func);
}
int main() {
signal<void()>sig1;
sig1.connect(slots1);
sig1();
SetEventDataReceived( std::bind(slots2 , std::placeholders::_1, std::placeholders::_2, 3) );
sig2(1, 2);
return 0;
}
得到打印结果:
slot 1 called
slot 2 get a 1 get b 2 get c 3
程序中:
我们主要通过signal来连接和使用信号槽
boost::signals2::signal<void()>sig1;
sig1.connect(slots1);
sig1();
连接的方式还可以通过:
void SetEventDataReceived(slot<void(int, int)> func){
sig2.connect(func);
}
这样的方式来通过函数来连接目标函数进一步实现解耦,
若要传递更多参数,可以在main中通过bind来传递。