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

牧光小院

被約束的日日夜夜,停不下來(lái)的時(shí)間。

C++的靜態(tài)分派技術(shù)

我們可以用不同的整數(shù)來(lái)實(shí)例化同一個(gè)模板,從而構(gòu)造不同的類型,進(jìn)而在編譯期執(zhí)行某些抉擇。


Alexandrescu 最初設(shè)計(jì)的一個(gè)簡(jiǎn)單的模版,現(xiàn)在成了泛型設(shè)計(jì)的常用手法:

template <int v>

struct Int2Type {

??? enum { value? = v };

};

對(duì)于每一個(gè)不同的常整數(shù), Int2Type 都代表不同的類型。這是因?yàn)椴煌哪0鎸?shí)例化都代表不同的類型,也就是說(shuō) Int2Type<0> Int2Type<1> 是完全不同的。

當(dāng)你想根據(jù)編譯時(shí)結(jié)果來(lái)進(jìn)行某些抉擇——例如選擇不同的函數(shù)——時(shí),你可以依賴一個(gè)常整數(shù)來(lái)幫你完成分派工作,這時(shí) Int2Type 便可以幫你是實(shí)現(xiàn)這個(gè)方法。

一般來(lái)說(shuō),你在下面兩個(gè)情況中需要使用 Int2Type

l ???????? 你需要根據(jù)編譯時(shí)常量來(lái)調(diào)用不同的函數(shù)

l ???????? 你需要在編譯時(shí)執(zhí)行分派工作

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

考慮下面的情形:你設(shè)計(jì)了一個(gè)泛型容器 NiftyContainer

template <class T> class NiftyContainer {

??? ...

};

NiftyContainer 容器包含指向 T 對(duì)象的指針。為了復(fù)制 NiftyContainer 中的一個(gè)對(duì)象,你可能需要調(diào)用 T 的拷貝構(gòu)造函數(shù)(對(duì)于非多態(tài)類型)或者一個(gè)名為 Clone() 的虛函數(shù)(對(duì)于多態(tài)類型)。你可以通過(guò)設(shè)置一個(gè) bool 類型的模版參數(shù)來(lái)從類的客戶手里獲得關(guān)于多態(tài)的信息。

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

?????? }

??? }

};

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

對(duì)于非多態(tài)類型分支,也有可能發(fā)生編譯錯(cuò)誤。如果 T 是一個(gè)多態(tài)類型,并且把它的拷貝構(gòu)造函數(shù)設(shè)定為 private 的時(shí)候(這時(shí)一個(gè)多態(tài)類的良好行為),非多態(tài)分支的 new T(*pObj) 就會(huì)發(fā)生錯(cuò)誤。

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

其實(shí),方法有很多, Int2Type 提供了一個(gè)簡(jiǎn)潔的辦法。它可以根據(jù) true false 來(lái)生成兩個(gè)不同的類型,而后根據(jù) Int2Type<isPolymorphic> 評(píng)估正確的調(diào)用。

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>());

??? }

};

當(dāng)你想把常整數(shù)用作一個(gè)類型的時(shí)候, Int2Type 是非常方便的。你可以傳遞一個(gè)臨時(shí)的變量來(lái)重載函數(shù)。而之所以我們可以這樣做,是因?yàn)榫幾g器不會(huì)去編譯沒(méi)有用到的模板函數(shù)。

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

評(píng)論

# re: C++的靜態(tài)分派技術(shù) 2005-11-15 16:36 christanxw

這在STL中有著廣泛的應(yīng)用  回復(fù)  更多評(píng)論   

# re: C++的靜態(tài)分派技術(shù) 2008-07-25 09:58 tomlau

真好,學(xué)習(xí)了  回復(fù)  更多評(píng)論   

<2008年7月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

導(dǎo)航

統(tǒng)計(jì)

常用鏈接

留言簿(2)

隨筆分類

收藏夾

大家的聲音

積分與排名

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久亚洲不卡| 国产精品久久77777| 亚洲性线免费观看视频成熟| 久久精品国产清自在天天线 | 国产精品毛片a∨一区二区三区| 久久精品国产77777蜜臀| 亚洲乱码国产乱码精品精天堂| 一区二区电影免费观看| 亚洲免费在线观看视频| 欧美freesex8一10精品| 日韩一级二级三级| 91久久国产自产拍夜夜嗨 | 久久国产手机看片| 欧美一区二区在线免费播放| 欧美在线免费视频| 亚洲欧美电影在线观看| 在线视频精品一区| 亚洲午夜一区| 亚洲一区二区免费看| 亚洲高清在线精品| 日韩午夜在线观看视频| 一区二区三区在线视频观看| 欧美视频观看一区| 国产精品久久久久久久久免费桃花 | 久久久久久久波多野高潮日日| 久久久一区二区三区| 亚洲欧洲久久| 性欧美video另类hd性玩具| 欧美综合国产| 亚洲高清免费视频| 蜜臀va亚洲va欧美va天堂| 久久超碰97中文字幕| 久久国产精品一区二区| 欧美影院成人| 国产欧美一区二区三区久久人妖| 欧美日韩直播| 亚洲毛片在线免费观看| 亚洲美女中文字幕| 久久午夜国产精品| 亚洲先锋成人| 免费久久99精品国产| 亚洲欧美日韩一区二区三区在线 | 亚洲私拍自拍| 久久黄色影院| 欧美国产第二页| 中文亚洲欧美| 欧美日韩国产成人在线| 女人天堂亚洲aⅴ在线观看| 9久草视频在线视频精品| 久久人人爽人人爽| 韩国三级电影久久久久久| 久久一区二区视频| 一区二区三区精品在线| 欧美精品国产一区| 国产精品一区二区三区免费观看| 午夜宅男久久久| 亚洲电影在线免费观看| 一区二区三区视频在线播放| 欧美在线你懂的| 99亚洲精品| 久久综合一区二区三区| 亚洲视频1区| 久久精品视频在线观看| 亚洲欧美日韩专区| 一本一本大道香蕉久在线精品| 91久久午夜| 精品99一区二区| 亚洲午夜av| 亚洲免费av片| 欧美成人一区二区三区在线观看| 欧美高清免费| 欧美成人网在线| 亚洲色图自拍| 亚洲一区二区在线播放| 激情久久久久久久久久久久久久久久| 亚洲欧美文学| 亚洲欧美一区二区三区在线| 洋洋av久久久久久久一区| 狠狠网亚洲精品| 亚洲一区三区在线观看| 99国产精品一区| 欧美在线日韩| 一区二区三区精品久久久| 久久黄色级2电影| 欧美一级专区免费大片| 一区二区三区在线视频免费观看 | 欧美在线视频全部完| 欧美在线观看网址综合| 国产午夜精品全部视频播放| 免费成人黄色片| 国产欧美一区二区三区在线老狼| 欧美成人亚洲成人| 国产一区二区高清| 免费黄网站欧美| 亚洲欧美精品在线| 欧美国产综合一区二区| 亚洲国产小视频| 麻豆久久精品| 亚洲二区精品| 亚洲图片在区色| 亚洲欧美日韩视频二区| 国产一区二区精品丝袜| 午夜欧美大尺度福利影院在线看| 午夜欧美精品久久久久久久| 国产欧美一区二区三区在线看蜜臀 | 一区二区三区国产在线| 亚洲综合日本| 国产欧美日韩综合精品二区| 欧美在线播放| 亚洲欧美日韩另类精品一区二区三区| 日韩午夜黄色| 亚洲欧洲日产国码二区| 今天的高清视频免费播放成人 | 一区二区日韩| 欧美激情在线有限公司| 99精品视频一区二区三区| 国产日本亚洲高清| 欧美视频网址| 欧美视频在线观看一区二区| 欧美日韩精品| 欧美国产视频在线| 老鸭窝91久久精品色噜噜导演| 亚洲欧洲精品一区二区精品久久久| 欧美日韩国产综合视频在线观看中文 | 美日韩精品视频| 亚洲一卡久久| 久久激情视频免费观看| 久久中文字幕导航| 欧美特黄一级大片| 欧美电影免费观看大全| 欧美亚洲免费在线| 亚洲激情第一页| 亚洲免费大片| 亚洲欧美日韩国产中文在线| 亚洲国产欧美日韩| 午夜在线观看免费一区| 欧美亚洲三区| 欧美影院午夜播放| 你懂的网址国产 欧美| 国产精品乱码久久久久久| 国产综合精品一区| 国产噜噜噜噜噜久久久久久久久| 国产精品久久99| 国产一区三区三区| av不卡在线看| 欧美成人在线网站| 欧美一级网站| 免费日韩成人| 国产亚洲毛片在线| 亚洲卡通欧美制服中文| 欧美一区2区三区4区公司二百| 亚洲国产欧美一区二区三区久久| 亚洲日本中文字幕免费在线不卡| 亚洲日产国产精品| 欧美一区精品| 国产精品v片在线观看不卡| 国语自产在线不卡| 在线一区视频| 亚洲国产欧美在线人成| 久久久噜噜噜久久中文字幕色伊伊| 国产精品qvod| 亚洲欧美日韩爽爽影院| 亚洲天堂网站在线观看视频| 国产精品乱子久久久久| 新狼窝色av性久久久久久| 欧美精品久久久久久| 韩国精品一区二区三区| 欧美在线免费一级片| 亚洲欧美精品在线| 亚洲国产第一页| 99伊人成综合| 亚洲国产裸拍裸体视频在线观看乱了中文 | 国产在线欧美日韩| 亚洲伦理在线观看| 国产欧美va欧美不卡在线| 99re这里只有精品6| 久久久亚洲精品一区二区三区| 久久爱另类一区二区小说| 亚洲国产精品女人久久久| 亚洲福利在线看| 激情国产一区二区| 亚洲二区三区四区| 欧美日韩一二三区| 玖玖国产精品视频| 欧美调教vk| 亚洲日本va午夜在线电影| 国产精品一区久久| 久久国产天堂福利天堂| 欧美午夜精品久久久久免费视| 亚洲人成在线观看一区二区| 一区二区三区久久精品| 国产精品高潮粉嫩av| 亚洲人精品午夜| 亚洲第一伊人| 亚洲韩国精品一区| 激情久久久久久久久久久久久久久久| 亚洲精品中文字幕在线| 亚洲国产精品ⅴa在线观看| 香蕉久久夜色精品国产| 夜夜嗨一区二区|