template应用之Policies和Policy Classes
Policies和Policy Classes
什么是Policy?
Policy定義一個class或class template的接口,該接口由內隱型別定義( inner type definition) 、成員函數和成員變量之一或全部組成。
例子
聲明Policy:policy_Create()可以理解為一種語法約束:
實現Policy
聲明Policy約束實現Policy必須實現Create接口,并滿足Create接口協議。至于如何實現Create接口,則可以有很多的技術選擇,如下代碼有通過new、malloc + Placement new、Prototype等實現。
這也是面向接口編程的一種方式:實現不應該依賴于具體細節,應該依賴于接口(抽象)。
通過上述Policy和Policy Classes可以組合滿足多種需求:
更為重要的是,Policy與Policy Classes是松散的,沒有接口繼承那種強綁定關系。只要滿足Policy約定就可以自由裝配(組合)。
這就是template 組合的魅力!!!
當然由template特性決定,Policy是編譯期的靜態綁定,不適用于動態連結和二進位接口。
從這點看,Policy與傳統的接口具有一定的互補關系。
Policy支持用戶擴展
通過Template和繼承結合,繼承Policy的類可以獲得Policy特有的類信息。實現類可以根據需要定制這些信息,這種好處是使用者決定用什么,而不是庫決定使用者用什么,具有更多的靈活性。
Policy的析構函數
不完整具現化
如果class template有一個成員函數未曾被用到,它就不會被編譯器具體實現出來。編譯器不理會它,甚至也許不會為它進行語法檢驗。
如何獲得Policy類
將參與class行為的設計鑒別出來并命名之。任何事情只要能以一種以上的方法解決,都應該被分析出來,并從class中移出來成為policy。
當你將class分解為policies 時,找到正交分解很重要。正交分解會產生一些彼此完全獨立的policies。
Policies機制
templates + 多重繼承
template <class T,template<class> class CheckingPolicy,template <class> class ThreadingModel,template <class> class Storage = Defau1tSmartPtrStorage > class SmartPtr : public CheckingPolicy<T>, public ThreadingModel<T>, public Storage<T> { // ... };由Policies設計的class的優勢
環繞著policies而設計出來的classes,支持“可擴充的行為”和“優雅的機能削減”。由于采用“public繼承”之故,policy得以通過host class提供追加機能。而 host classes也能運用“policy提供的選擇性機能”實作出更豐富的功能。如果某個選擇性機能不存在,host class還是可以成功編譯,前提是該選擇性機能未被真正用上。
class拆分policies準則
第一,將class內的“設計決定”局部化、命名、分離出來;
第二,找出正交的policies-——也就是彼此之間無交互作用、可獨立更動的policies。
總結
以上是生活随笔為你收集整理的template应用之Policies和Policy Classes的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 北京 php 外包,=== | php外
- 下一篇: 关于a:hover span和a spa