简介函数
signal是为了解决类之间通讯的问题而出现的,更深刻的缘由是面向对象讲究封装,可是封装必然致使类之间沟通困难,可是使用接口的方式又过重量级--须要写不少代码,并且会致使接口爆炸spa
好比你须要把一个接口拆分为两个时,你得作不少工做,这个时候signal的好处就出现了.net
signal库对象
signal库主要有QT的signal,boost的signal与signalslot(http://sigslot.sourceforge.net/)
继承
这里谈谈signalslot接口
使用它须要定义signal,而后将成员函数绑定到signal上面,实现方法不外是functorget
带槽的类须要继承一个has_slot,能够猜到has_slot的目的是配合signal进行信号和槽的生存期管理,这样类销毁的时候不须要手动去disconnect编译
我司的signal系统模板
公司有一套庞大的模板代码,里面有不少轮子,其中就包含了signal系统,公司的signal库其实相比以上这些有一个很大的优点,使用多个signal的时候不须要声明对个signal实例,你只须要带有一个signalHolder,而后新加信号方法
只须要一个signalID和其对应的函数声明就好了,这有个很大的好处:少些不少代码,也更灵活.
可是公司的signal没有生存期管理,这意味着你必须手动在signalHolder中删除槽,这样的好处是下降了复杂度--让带槽类再去继承一个类实在是很丑陋,也让使用者很费解
并且在实际的工程中我也发现须要自动生存期管理的状况不多,手动删除槽的代码量也不是很大
末尾吐槽一下微软的STL实现,用宏实现的模板多参实在是太丑陋了,用宏致使stl编译错误有如天书,我准备本身实现functor和bind了