c++中的signal機制

簡介函數

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了

相關文章
相關標籤/搜索