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

牧光小院

被約束的日日夜夜,停不下來的時間。

C++的靜態分派技術

我們可以用不同的整數來實例化同一個模板,從而構造不同的類型,進而在編譯期執行某些抉擇。


Alexandrescu 最初設計的一個簡單的模版,現在成了泛型設計的常用手法:

template <int v>

struct Int2Type {

??? enum { value? = v };

};

對于每一個不同的常整數, Int2Type 都代表不同的類型。這是因為不同的模版實例化都代表不同的類型,也就是說 Int2Type<0> Int2Type<1> 是完全不同的。

當你想根據編譯時結果來進行某些抉擇——例如選擇不同的函數——時,你可以依賴一個常整數來幫你完成分派工作,這時 Int2Type 便可以幫你是實現這個方法。

一般來說,你在下面兩個情況中需要使用 Int2Type

l ???????? 你需要根據編譯時常量來調用不同的函數

l ???????? 你需要在編譯時執行分派工作

如果是在運行時執行分派工作,你可以用 if-else switch 語句來簡單的實現。在大部分的時候,這種運行時成本都是微不足道的。但是,有時它們卻不能滿足你的要求。既是是在編譯期可以決定其分支,編譯器還是會勤勞的為你編譯其所有的分支,這也就意味著 if-else 的所有分支必須被成功編譯。有些困惑?繼續看下去:

考慮下面的情形:你設計了一個泛型容器 NiftyContainer

template <class T> class NiftyContainer {

??? ...

};

NiftyContainer 容器包含指向 T 對象的指針。為了復制 NiftyContainer 中的一個對象,你可能需要調用 T 的拷貝構造函數(對于非多態類型)或者一個名為 Clone() 的虛函數(對于多態類型)。你可以通過設置一個 bool 類型的模版參數來從類的客戶手里獲得關于多態的信息。

template <class T, bool isPolymorphic> class NiftyContainer {

??? // Other actions

??? void DoSomething() {

?????? T* pSomeObj = ...;

?????? if(isPolymorphic) {

?????????? T* pNewObj = pSomeObj->Clone();

?????????? // Some polymorphic algorithm

?????? }

?????? else {

?????????? T* pNewObj = new T(*pSomeObj);

?????????? // Some non-polymorphic algorithm

?????? }

??? }

};

問題在于編譯器不會讓你僥幸編譯上面的代碼。例如,如果一個多態類型沒有定義 Clone() ,那么 NiftyContainer::DoSomething 絕對不會通過編譯。盡管在編譯時我們肯定可以對于分支進行判斷,但這畢竟不是編譯器的工作,他只會勤勞的為你編譯出所有的代碼。于是當你試圖調用 NiftyContainer<int, false>::DoSomething 的時候,編譯器還是會停在 pObj->Clone() 上,并且抱怨說:“你在做什么?”

對于非多態類型分支,也有可能發生編譯錯誤。如果 T 是一個多態類型,并且把它的拷貝構造函數設定為 private 的時候(這時一個多態類的良好行為),非多態分支的 new T(*pObj) 就會發生錯誤。

你可能會想,如果編譯器可以不去理會那些不必要的分支就好了,但是看來不太可能。那么,如何是好呢?

其實,方法有很多, Int2Type 提供了一個簡潔的辦法。它可以根據 true false 來生成兩個不同的類型,而后根據 Int2Type<isPolymorphic> 評估正確的調用。

template <class T, bool isPolymorphic> class NiftyContainer {

private :

??? // Other actions

??? void DoSomething(T* pObj, Int2Type<true>) {

?????? T* pNewObj = pSomeObj->Clone();

?????? // Some polymorphic algorithm

??? }

??? void DoSomething(T* pObj, Int2Type<false>) {

?????? T* pNewObj = new T(*pSomeObj);

?????? // Some non-polymorphic algorithm

??? }

public :

??? void DoSomething(T* pObj) {

?????? DoSomething(pObj, Int2Type<isPolymorphic>());

??? }

};

當你想把常整數用作一個類型的時候, Int2Type 是非常方便的。你可以傳遞一個臨時的變量來重載函數。而之所以我們可以這樣做,是因為編譯器不會去編譯沒有用到的模板函數。

posted on 2005-11-11 11:42 nacci 閱讀(2429) 評論(2)  編輯 收藏 引用 所屬分類: C++漫談

評論

# re: C++的靜態分派技術 2005-11-15 16:36 christanxw

這在STL中有著廣泛的應用  回復  更多評論   

# re: C++的靜態分派技術 2008-07-25 09:58 tomlau

真好,學習了  回復  更多評論   

<2005年11月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

導航

統計

常用鏈接

留言簿(2)

隨筆分類

收藏夾

大家的聲音

積分與排名

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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| 国产酒店精品激情| 免费毛片一区二区三区久久久| 亚洲午夜精品久久| 国产视频精品xxxx| 国产精品女主播在线观看| 午夜精品久久久久久久久久久久久 | 亚洲日本激情| 亚洲美女在线国产| 小处雏高清一区二区三区| 亚洲欧美日韩人成在线播放| 国产精品综合网站| 国产一区亚洲| 欧美日韩情趣电影| 欧美日韩亚洲综合| 国产日韩一区| 亚洲国产精品一区二区尤物区| 日韩视频久久| 亚洲欧美日韩国产精品 | 欧美高清不卡在线| 日韩亚洲精品电影| 麻豆精品视频| 永久免费精品影视网站| 亚洲免费av片| 性色一区二区三区| 亚洲国产日韩欧美综合久久| 99国产精品视频免费观看一公开 | 99精品福利视频| 欧美一区二区福利在线| 亚洲老司机av| 激情综合在线| 国产伦精品一区二区三区视频孕妇 | 国产精品久久久久婷婷| 久热综合在线亚洲精品| 最新日韩在线| 黄色影院成人| 久久久91精品国产一区二区三区| 欧美国产免费| 一本一本久久a久久精品综合妖精| 狠狠色狠狠色综合日日tαg| 国产夜色精品一区二区av| 亚洲美女在线看| 蜜桃久久av一区| 久久久999精品免费| 欧美一区二区三区日韩视频| 亚洲国产精品一区在线观看不卡 | 欧美在线观看网站| 欧美日韩免费观看中文| 欧美日韩国产欧| 在线免费日韩片| 久久久激情视频| 久久免费国产精品| 一本色道久久综合精品竹菊 | 午夜激情综合网| 一本在线高清不卡dvd| 欧美精品一区在线观看| 午夜一区二区三区不卡视频| 亚洲国产精品一区制服丝袜| 欧美 亚欧 日韩视频在线| 久久一二三国产| 一本色道精品久久一区二区三区| 久久夜色精品一区| 亚洲片国产一区一级在线观看| 亚洲精品1区2区| 亚洲美女在线看| 亚洲一区在线直播| 欧美专区中文字幕| 女仆av观看一区| 黄色成人av| 欧美国产日本| 欧美成人首页| 欧美成人午夜视频| 国产精品老牛| 午夜精品久久久久久久久| 中文一区二区| 国产原创一区二区| 老鸭窝91久久精品色噜噜导演| 猫咪成人在线观看| 亚洲日本在线观看| 亚洲免费观看高清在线观看| 欧美日韩国产精品一卡| 午夜日韩在线| 欧美国产日韩视频| 欧美电影免费| 亚洲欧美文学| 91久久夜色精品国产九色| 欧美电影免费| 香蕉亚洲视频| 欧美大片第1页| 老鸭窝91久久精品色噜噜导演| 久久嫩草精品久久久久| 噜噜噜在线观看免费视频日韩| 亚洲欧洲一区二区三区在线观看| 亚洲欧洲一区| 夜夜精品视频一区二区| 国产视频在线观看一区二区| 久热这里只精品99re8久| 久久久久一区二区三区| 免费观看国产成人| 亚洲一区欧美一区| 欧美日本精品| 一区二区三区无毛| 亚洲国产cao| 国产精品一级久久久| 在线亚洲免费| 亚洲福利在线观看| 国产精品视频福利| 亚洲欧美国产日韩天堂区| 欧美一区二区视频网站| 国产精品免费视频xxxx| 女仆av观看一区| 国产精品永久入口久久久| 中文在线不卡视频| 久久精品在线| 欧美视频在线观看 亚洲欧| 欧美成人免费一级人片100| 国产精品国产福利国产秒拍 | 亚洲另类春色国产| 欧美激情视频一区二区三区在线播放 | 麻豆国产精品777777在线| 欧美日韩亚洲激情| 亚洲狼人综合| 亚洲精品在线二区| 伊人久久亚洲影院| 久久久久久久网站| 欧美在线啊v| 国产一二三精品| 日韩一区二区精品葵司在线| 亚洲日本va午夜在线影院| 久久国产加勒比精品无码| 久久精品动漫| 久久久夜色精品亚洲| 久久爱另类一区二区小说| 亚洲图片欧美一区| 亚洲视频第一页| 99re66热这里只有精品3直播| 久久久精品动漫| 亚洲国产经典视频| 欧美亚洲视频| 亚洲性线免费观看视频成熟| 久久久97精品| 99v久久综合狠狠综合久久| 久久精品99国产精品酒店日本| 尤物在线观看一区| 亚洲人成在线免费观看| 亚洲欧洲一区二区天堂久久| 国产精品美女久久久久久免费| 亚洲精品在线视频观看| 国产美女精品人人做人人爽| 亚洲私人影院| 欧美在线观看视频| 欧美激情国产精品| 亚洲精选久久| 香蕉av777xxx色综合一区| 国产日韩欧美精品综合| 精品51国产黑色丝袜高跟鞋| 久久疯狂做爰流白浆xx| 欧美激情精品久久久六区热门 | 亚洲黄色在线观看| 久久大香伊蕉在人线观看热2| 欧美一级理论片| 久久久久综合网| 欧美色道久久88综合亚洲精品| 久久av红桃一区二区小说| 国产啪精品视频| 久久久噜噜噜久久久| 亚久久调教视频| 欧美精品三区| 蜜臀av在线播放一区二区三区| 亚洲第一区在线| 欧美一级久久久| 欧美激情视频免费观看| 国产欧美精品在线播放| 久久成人这里只有精品| 亚洲欧美自拍偷拍| 国产精品豆花视频| 久久精品国产99国产精品澳门 | 国产精品毛片va一区二区三区| 欧美伊人久久久久久久久影院| 亚洲精品乱码久久久久久| 欧美二区视频| 国产日韩精品一区二区三区在线| 亚洲黄网站在线观看| 久久国产毛片| 欧美日韩中文精品| 久久精品国产一区二区三| 亚洲精品一区中文| 日韩一区二区福利| 国产欧美日韩免费| 欧美人与禽猛交乱配视频| 亚洲激情专区| 新片速递亚洲合集欧美合集| 亚洲国产精品999| 国产欧美日韩精品a在线观看| 欧美日韩国产在线| 久久久欧美精品| 欧美电影免费观看网站| 一区免费观看视频| 午夜在线精品偷拍|