日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

template应用之Policies和Policy Classes

發布時間:2023/12/16 编程问答 60 豆豆
生活随笔 收集整理的這篇文章主要介紹了 template应用之Policies和Policy Classes 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Policies和Policy Classes

什么是Policy?

Policy定義一個class或class template的接口,該接口由內隱型別定義( inner type definition) 、成員函數和成員變量之一或全部組成。

例子

聲明Policy:policy_Create()可以理解為一種語法約束:

  • 要有Create()接口
  • Create()返回值必須是T*
  • template<typename Policy> struct Creator {explicit Creator(Policy& policy) : policy_(policy)T* Create(){return policy_.Create();}private:Policy& policy_; }

    實現Policy
    聲明Policy約束實現Policy必須實現Create接口,并滿足Create接口協議。至于如何實現Create接口,則可以有很多的技術選擇,如下代碼有通過new、malloc + Placement new、Prototype等實現。
    這也是面向接口編程的一種方式:實現不應該依賴于具體細節,應該依賴于接口(抽象)。

    template<typename T> struct OpNewCreator {static T* Create(){return new T;} };template<typename T> struct MallocCreator {static T* create(){void* buf = std::malloc(sizeof(T));if (!buf) return nullptr;return new(buf) T;} };temp1ate<typename T> struct PrototypeCreator {PrototypeCreator(T* pObj = nullptr) : pPrototype_(pObj){}T* Create(){return pPrototype_ ? pPrototype_->Clone() : nullptr;}T* GetPrototype() { return pPrototype_; }void setPrototype (T* pObj) { pPrototype_ = p0bj; } private:T* pPrototype_; };

    通過上述Policy和Policy Classes可以組合滿足多種需求:

  • Creator<OpNewCreator<T>>
  • Creator<MallocCreator<T>>
  • Creator<PrototypeCreator<T>>
  • 更為重要的是,Policy與Policy Classes是松散的,沒有接口繼承那種強綁定關系。只要滿足Policy約定就可以自由裝配(組合)。
    這就是template 組合的魅力!!!
    當然由template特性決定,Policy是編譯期的靜態綁定,不適用于動態連結和二進位接口。
    從這點看,Policy與傳統的接口具有一定的互補關系。

    Policy支持用戶擴展

    通過Template和繼承結合,繼承Policy的類可以獲得Policy特有的類信息。實現類可以根據需要定制這些信息,這種好處是使用者決定用什么,而不是庫決定使用者用什么,具有更多的靈活性。

    Policy的析構函數

  • 不能使用虛析構函數,虛表指針會帶來內存和性能上的負擔
  • 不能是private或protected派生,會失去Policy的部分特性
  • 輕量辦法,Policy類提供protected析構函數,保證只能子類使用,以現在向上轉型帶來的資源釋放問題
  • struct OpNewCreator {template <class T>static T* Create(){return new T;} protected :~OpNewCreator() { } };

    不完整具現化

    如果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的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。