兩個(gè)不同的術(shù)語以及各自的動(dòng)作:信號(hào)和槽;
在一個(gè)地方(信號(hào))可以連接零個(gè)或者多個(gè)回調(diào)函數(shù)(槽),同時(shí)也是多對多的;
焦點(diǎn)在于連接本身,而不是提供者或者消費(fèi)者;
不需要手工為了一個(gè)連接創(chuàng)建新的類;
連接仍舊是類型安全的。
這五點(diǎn)是信號(hào)槽系統(tǒng)的核心,Qt 和 boost 都擁有這些特性。下面則是二者的不同之處:
Boost.Signals
Qt Signals 和 Slots
一個(gè)信號(hào)就是一個(gè)對象 信號(hào)是具有名字的成員函數(shù)的簽名
發(fā)出信號(hào)類似于函數(shù)調(diào)用 發(fā)出信號(hào)類似于函數(shù)調(diào)用,Qt 提供了一個(gè) emit 關(guān)鍵字來完成這個(gè)操作
信號(hào)可以是全局的、局部的或者是成員對象 信號(hào)只能是成員函數(shù)
任何能夠訪問到信號(hào)對象的代碼都可以發(fā)出信號(hào) 只有信號(hào)的擁有者才能發(fā)出信號(hào)
槽是任何可被調(diào)用的函數(shù)或者函數(shù)對象 槽是經(jīng)過特別設(shè)計(jì)的成員函數(shù)
可以有返回值,返回值可以在多個(gè)槽中使用 沒有返回值
同步的 同步的或者隊(duì)列的
非線程安全 線程安全,可以跨線程使用
當(dāng)且僅當(dāng)槽是可追蹤的時(shí)候,槽被銷毀時(shí),連接自動(dòng)斷開 槽被銷毀時(shí),連接都會(huì)自動(dòng)斷開(因?yàn)樗胁鄱际强勺粉櫟模?
類型安全(編譯器檢查) 類型安全(運(yùn)行期檢查)
參數(shù)列表必須完全一致 槽可以忽略信號(hào)中多余的參數(shù)
信號(hào)、槽可以是模板 信號(hào)、槽不能是模板
C++ 直接實(shí)現(xiàn) 通過由 moc 生成的元對象實(shí)現(xiàn)(moc 以及元對象系統(tǒng)都是 C++ 直接實(shí)現(xiàn)的)
沒有內(nèi)省機(jī)制 可以通過內(nèi)省發(fā)現(xiàn)
可以通過元對象調(diào)用
連接可以從資源文件中自動(dòng)推斷出
最重要的是,Qt 的信號(hào)槽機(jī)制已經(jīng)深深地植入到框架之中,成為不可分割的一部分。它們可以使用 Qt 專門的開發(fā)工具,例如 QtCreator,通過拖拽的方式很輕松的創(chuàng)建、刪除、修改。它們甚至可以通過動(dòng)態(tài)加載資源文件,由特定命名的對象自動(dòng)動(dòng)態(tài)生成。這些都是 boost 作為一個(gè)通用庫所不可能提供的。
本文導(dǎo)航
- 第1頁: 首頁
- 第2頁: 使用信號(hào)槽
- 第3頁: 兩個(gè)不同的術(shù)語以及各自的動(dòng)作:信號(hào)和槽