青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 13, comments - 4, trackbacks - 0, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

Imperfect C++ 讀書筆記(四)

Posted on 2008-11-22 22:57 Batiliu 閱讀(636) 評論(0)  編輯 收藏 引用 所屬分類: 讀書筆記

墊片(Shim)

在C++中,邏輯相關的類型通常具有不兼容的接口和操作,這使得人們有時難于、甚至無法進行泛化的類型操縱。

在泛型世界里,各式各樣的語法妨礙語義的例子不計其數。當我們將一個類型改變為另一個跟它語義類似的類型時,總希望編譯器能夠幫我們打點一切,但顯然它不能,除非我們可以幫幫它。因此,我們的做法就是往縫隙里插入一些墊片(shim),從而讓一些東西妥當地貼合起來。軟件工程中有個經典的“萬靈藥”,即增加一個間接層。這正是墊片概念全部的本質。

在模板出現以前的古典主義C++里,基于虛函數表的多態機制體現出的是名字一致性:即派生類重寫父類同名的方法。而模板函數的出現帶來了結構一致性:對于看起來一樣的東西,我們可以期望它們具有相同的行為。簡單地說,結構一致性確保類型的編譯器兼容,而名字一致性則取保類型的運行期兼容性。

但結構一致性的弱點在于結構上一致的代碼很可能做的是語義上不一致的事情。而墊片的使用在避免這個問題方面邁出了顯著的一步。墊片表現了一種約定,借助該約定,結構一致性得以擴展以包含每個墊片對應的一個明確的語義。墊片是對所謂的結構一致性的一種提煉和升華,即語義一致性。

  • 特性墊片

特性墊片用于從它們為之定義的類型的實例身上抽取某些特性或狀態。如:

// 舉例:特性墊片
// 從各種指針類型上取出出原生指針特性。
 
template<typename T>
inline T* get_ptr(T* p)
{
    return p;
}
 
template<typename TL
inline T* get_ptr(std::auto_ptr<T>& p)
{
    return p.get();
}
 
template<typename T>
inline T const * get_ptr(std::auto_ptr<T> const & p)
{
    return p.get();
}
 
template<typename T>
inline T* get_ptr(comstl::interface_ptr<T>& p)
{
    return p.get_interface_ptr();
}

 

  • 邏輯墊片

邏輯墊片是特性墊片的一個精化,它們用于匯報實例的狀態。

// 舉例:邏輯墊片
// 泛化對任何容器的狀態的訪問。
 
template<typename T>
bool is_empty(T const & c)
{
    return c.empty();
}
 
bool is_empty(CString const & s)
{
    return s.IsEmpty();
}
 
bool is_empty(comstl::interface_ptr const & p)
{
    return NULL == p.get_interface_ptr();
}

 

  • 控制墊片

控制墊片用于操縱它們所服務的類型的實例。

如:make_empty() 或 dump_contents()等。

 

  • 轉換墊片

轉換墊片將一組互相兼容的類型的實例轉換至同一個目標類型。

轉換墊片的返回值可能由中間臨時對象提供,對于這種墊片,其返回值只能在包含該墊片的表達式當中被使用。

 

  • 訪問墊片(復合式墊片)

訪問墊片是特性墊片和轉換墊片的復合體,被用來訪問它們為之定義的類型的實例值。

// 舉例:訪問墊片
// 將構造函數的參數轉型為C const*,然后轉遞給init()方法,因此該類可以被用在任何字符串類型上。
 
template<typename C>
class X
{
public:
    explicit X(C const * p)
    {
        init(c_str_ptr(p));
    }
    template<typename S>
    explicit X(S const & s)
    {
        init(c_str_ptr(s));
    }
    ...
private:
    void init(C const * p);
    ...
};
 
inline char const * c_str_ptr(char const * p)
{
    return p;
}
 
inline wchar_t const * c_str_ptr(wchar_t const * s)
{
    return s;
}
 
template<typename T>
inline T const * c_str_ptr(std::basic_string<T> const & s)
{
    return s.c_str();
}
 
template<typename T>
inline T const * c_str_ptr(stlsoft::basic_frame_string<T> const & s)
{
    return s.c_str();
}
 
// 應用場景
//
char const *                s1 = ...
std::basic_string<char>     s2 = ...
std::basic_string<wchar_t>  s3 = ...
 
X<char>        o1(s1);
X<char>        o2(s2);
X<wchar_t>     o3(s3;

 

飾面(Veneer)

飾面用于將類型或功能一種精細的方式覆蓋于現行類型之上,飾面通常于將“最終接觸面”覆蓋在一個現有的、實質性的類型之上。飾面也可以用于將特定的行為綁定到一個簡單的類型上。

飾面是一種具有如下特征的類模板:

  1. 它繼承自它的主參數化類型,而且通常是公有繼承。
  2. 它適應并遵循它的主參數化類型的多態性質,這意味著飾面不能定義它自己的任何虛函數,盡管它可以重寫它的主參數化類型中定義的那些虛函數。
  3. 它不能定義屬于自己的任何非靜態成員變量。

第2、3點意味著飾面不能改變它的主參數化類型的內存占用多少,這是通過EDO(Empty Derived Optimization,空派生類優化)實現的。

 

螺栓(Bolt)

飾面和螺栓之間的區別并不明顯,但它們是為不同的意圖而誕生的。飾面是用于“潤飾”現存類型的,而螺栓則是用于顯著改變或完善類型的行為特征的。

螺栓是具有如下特征的類模板:

  1. 它們繼承(通常是公有繼承)自它們的主參數化類型。
  2. 它們和它們的主參數化類型的多態性質相適應。但除了重寫虛函數外,還可以定義自己的虛函數。
  3. 由于它們可以定義自己的成員變量、虛函數或從另外的非空類繼承,所以它們可能會增添額外的內存占用。

 

擬編譯期多態:逆反式螺栓

template<typename T>
struct Base
{
    void Do()
    {
        static_cast<T*>(this)->Do();
    }
};
 
struct Derived : public Base<Derived>
{
    void Do();
};
 
template<typename T>
void f(Base<T>* p)
{
    p->Do();
}

通過上例,可以看到,我們通過編譯期多態,替代了運行期多態(虛函數),而實現了設計模式之模板方法,避免了運行期間接調用所帶來的開銷。

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美激情视频给我| 欧美激情中文字幕乱码免费| 在线观看亚洲一区| 国内精品伊人久久久久av影院 | 亚洲欧美日韩国产精品| 亚洲一区久久久| 午夜在线视频一区二区区别| 欧美在线视频二区| 久久久99爱| 亚洲色在线视频| 国产美女精品视频| 国产亚洲成人一区| 亚洲福利一区| 99精品国产高清一区二区| 亚洲网站在线| 久久久噜噜噜久久久| 欧美搞黄网站| av成人毛片| 久久久久成人精品| 欧美性大战久久久久久久| 国产亚洲精品久久久久动| 在线播放中文一区| 亚洲午夜电影网| 欧美mv日韩mv亚洲| 一区二区三区四区在线| 久久青草久久| 国产精品久久久久久av下载红粉| 狠狠v欧美v日韩v亚洲ⅴ| 99这里只有精品| 蜜臀久久99精品久久久画质超高清| 亚洲精品美女免费| 亚洲一区二区精品视频| 欧美大片免费看| 激情六月婷婷久久| 午夜精品视频在线| 亚洲人成人一区二区三区| 久久aⅴ国产欧美74aaa| 欧美日韩一级视频| 亚洲国产裸拍裸体视频在线观看乱了中文| 99成人在线| 欧美sm视频| 久久久久高清| 欧美成人免费视频| 亚洲一区二区免费看| 欧美xxx在线观看| 一区久久精品| 久久久久久穴| 亚洲欧美视频| 欧美亚洲不卡| 亚洲一级一区| av成人免费在线| 欧美极品欧美精品欧美视频| 亚洲国产精品第一区二区三区| 欧美一区二区成人| 日韩亚洲欧美精品| 欧美日韩精品一区二区| 亚洲精品偷拍| 亚洲国产精品专区久久| 麻豆亚洲精品| 亚洲国产精品国自产拍av秋霞| 久久久久综合网| 欧美在线视屏| 好看不卡的中文字幕| 美女亚洲精品| 久久精品亚洲精品国产欧美kt∨| 国产欧美日韩视频一区二区| 亚洲综合大片69999| 一区二区三区国产| 欧美日韩另类字幕中文| 亚洲开发第一视频在线播放| 欧美aa国产视频| 亚洲激情视频在线播放| 欧美成人精品不卡视频在线观看 | 欧美一区二区视频在线观看| 国产伦精品一区二区三区| 欧美一区二区三区四区在线观看地址| 一区二区电影免费观看| 国产精品地址| 欧美自拍偷拍午夜视频| 久久成人18免费网站| 影音先锋日韩资源| 亚洲国产精品久久久久秋霞蜜臀 | 欧美经典一区二区三区| 亚洲精品中文字| 亚洲精品久久久久久久久久久久| 欧美片在线观看| 亚洲一区二区三区三| 亚洲一区二区三区在线播放| 国产午夜久久久久| 欧美a级一区| 欧美日韩一区二区在线观看视频 | 欧美高清视频www夜色资源网| 久久综合影音| 在线一区日本视频| 午夜国产欧美理论在线播放| 在线精品亚洲| 一道本一区二区| 国内精品久久久久久影视8 | 亚洲一区久久久| 伊人精品在线| 亚洲日韩成人| 国产日韩一区| 亚洲欧洲偷拍精品| 国产欧美精品一区| 亚洲第一精品久久忘忧草社区| 欧美日韩一区二区在线视频 | 一本色道久久综合狠狠躁的推荐| 亚洲一级电影| 亚洲日本va午夜在线影院| 亚洲一区网站| 亚洲精品视频在线看| 欧美亚洲日本一区| 亚洲天堂网在线观看| 久久人人爽人人爽| 午夜精品久久久久久久久| 蜜桃av一区二区| 国产精品色午夜在线观看| 在线视频欧美一区| 亚洲欧洲日韩女同| 亚洲第一福利社区| 久久免费观看视频| 在线电影一区| 久久综合99re88久久爱| 欧美专区中文字幕| aⅴ色国产欧美| 亚洲国产日本| 欧美成人亚洲成人| 欧美在线亚洲在线| 欧美成人a∨高清免费观看| 亚洲欧美中文字幕| 香蕉久久一区二区不卡无毒影院| 国产一区二区成人| 日韩视频免费在线| 在线日韩视频| 亚洲视频在线观看| 亚洲精品123区| 久久精品视频亚洲| 亚洲男人的天堂在线aⅴ视频| 免费在线观看一区二区| 久久精品30| 国产精品一区二区你懂的| 亚洲欧洲一区二区三区| 亚洲午夜视频| 久久麻豆一区二区| 亚洲一区二区影院| 欧美美女bb生活片| 国产一区二区三区在线观看精品| 亚洲性感美女99在线| 在线亚洲精品| 欧美日韩精品久久久| 亚洲激情网站免费观看| 亚洲国内精品在线| 久久久亚洲人| 欧美 亚欧 日韩视频在线| 亚洲第一区在线观看| 久久裸体艺术| 亚洲国产欧美在线人成| 99国产精品久久久久久久| 欧美激情免费观看| 一本色道久久综合| 欧美一级成年大片在线观看| 国产视频观看一区| 久久综合伊人77777蜜臀| 亚洲丰满少妇videoshd| 夜夜嗨av一区二区三区免费区| 欧美日本高清一区| 亚洲视频精选在线| 久久久久一区二区三区| 一区二区久久久久| 性欧美videos另类喷潮| 伊人夜夜躁av伊人久久| 美日韩精品免费| 日韩视频在线一区二区三区| 午夜精品久久| 亚洲国产一区二区三区高清| 欧美精品二区三区四区免费看视频| 亚洲毛片播放| 久久se精品一区精品二区| 亚洲国产美女精品久久久久∴| 欧美日韩国产在线| 性欧美xxxx大乳国产app| 精品动漫av| 一区二区三区精品在线| 正在播放欧美视频| 国产精品入口66mio| 久久综合久色欧美综合狠狠| 亚洲福利视频一区| 香蕉久久a毛片| 极品裸体白嫩激情啪啪国产精品| 女人色偷偷aa久久天堂| 在线一区二区三区做爰视频网站 | 伊人成人在线| 欧美成人午夜激情在线| 亚洲网站在线看| 久久久久免费| 亚洲一区二区三区免费在线观看| 海角社区69精品视频| 欧美日韩国产综合视频在线观看| 欧美一区二区视频在线| 亚洲九九精品|