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

牧光小院

被約束的日日夜夜,停不下來(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 閱讀(2429) 評(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>
            久久精品国产清自在天天线| 欧美日韩另类字幕中文| 日韩一区二区精品葵司在线| 久久久久一区二区三区| 米奇777超碰欧美日韩亚洲| 亚洲大胆在线| 欧美日本国产视频| 亚洲免费一区二区| 麻豆精品传媒视频| 亚洲无线观看| 一区三区视频| 欧美三日本三级少妇三99| 久久国产精品99国产| 亚洲国产日韩在线一区模特| 亚洲一区二区成人| 亚洲精品1234| 激情小说亚洲一区| 国产精品网站在线观看| 欧美不卡视频一区发布| 午夜精品美女久久久久av福利| 欧美激情麻豆| 久久精品国产在热久久| 亚洲欧美久久久| 欧美在线在线| 亚洲一区二区视频在线| 99精品视频免费观看| 欧美大片18| 亚洲国产精品黑人久久久| 久久久亚洲精品一区二区三区 | 欧美高清视频一二三区| 欧美综合国产| 久久国产精品黑丝| 午夜欧美精品| 久久久国产精品亚洲一区| 亚洲欧美日韩一区二区在线| 在线亚洲欧美| 亚洲永久在线| 欧美一级电影久久| 国产精品欧美日韩久久| 国产欧美日韩视频一区二区三区| 欧美日韩视频第一区| 欧美日韩卡一卡二| 国产精品亚洲人在线观看| 国产精品一区视频网站| 国产日韩视频| 黄色精品免费| 一本色道久久综合亚洲91| 亚洲影院色无极综合| 久久国产精品久久精品国产| 欧美 日韩 国产精品免费观看| 欧美黑人一区二区三区| 亚洲人成网站影音先锋播放| 亚洲男人影院| 美女黄毛**国产精品啪啪| 欧美日韩在线播放一区| 激情一区二区三区| 亚洲一二区在线| 久久亚洲私人国产精品va媚药 | 亚洲人成人77777线观看| 亚洲深夜福利网站| 久久综合久色欧美综合狠狠| 国产精品爱久久久久久久| 很黄很黄激情成人| 亚洲视频精品| 欧美高清视频在线| 久久国产免费看| 国产欧美在线播放| 一区二区国产日产| 蜜桃av久久久亚洲精品| 亚洲视频在线视频| 欧美精品国产一区| 影音先锋久久| 免费影视亚洲| 久久人人爽人人爽| 国产亚洲综合在线| 久久爱www久久做| 亚洲欧美电影在线观看| 国产精品爱啪在线线免费观看| 欧美日韩国产一区二区三区地区| 国产一区二区三区久久久久久久久 | 欧美日韩高清在线| 在线看日韩av| 欧美国产一区二区三区激情无套| 久久精品99国产精品酒店日本| 国产精品影片在线观看| 久久免费视频网站| 久久精视频免费在线久久完整在线看| 国产酒店精品激情| 裸体一区二区| 欧美成人午夜激情视频| 中国女人久久久| 欧美一区二视频| 亚洲国产电影| 99国产精品久久久久久久久久| 国产精品草草| 久久久久久穴| 欧美日韩精品免费观看视频完整 | 亚洲欧美福利一区二区| 久久国产精品99精品国产| 亚洲人成毛片在线播放| 亚洲精品视频二区| 激情欧美一区二区三区在线观看 | 久久免费99精品久久久久久| 亚洲三级影片| 欧美伦理91| 一区二区欧美在线观看| 日韩午夜电影| 亚洲自拍电影| 99成人免费视频| 欧美精品一区二区在线观看| 亚洲精品久久久蜜桃| 国产精品美女久久福利网站| 久久影院午夜片一区| 国产亚洲亚洲| 久久女同互慰一区二区三区| 久久久久久久久蜜桃| 国模 一区 二区 三区| 99视频一区| 欧美成人午夜剧场免费观看| 女人天堂亚洲aⅴ在线观看| 国产欧美精品日韩| 亚洲专区国产精品| 亚洲视频在线看| 免费在线亚洲| 99pao成人国产永久免费视频| 日韩视频在线一区二区| 欧美视频网址| 亚洲性图久久| 久久人人爽人人爽| 在线观看成人一级片| 欧美69视频| 这里只有视频精品| 欧美影院久久久| 亚洲电影在线| 欧美日韩视频在线观看一区二区三区 | 欧美一区二区高清在线观看| 国产欧美日韩综合| 欧美另类视频在线| 久久夜色精品国产欧美乱极品| 亚洲一区二区高清视频| 久久精品国产第一区二区三区| 亚洲激情电影中文字幕| 国产精品揄拍一区二区| 欧美精品久久久久久久免费观看 | 一区二区三区视频在线观看| 亚洲欧美日韩在线综合| 亚洲国产精品久久精品怡红院| 欧美视频在线不卡| 久久婷婷影院| 亚洲国产一区二区a毛片| 欧美综合77777色婷婷| 亚洲精品视频免费| 尤物网精品视频| 国产日产亚洲精品| 国产精品久久久久婷婷| 欧美成人一区二区三区片免费| 亚洲一区二区成人在线观看| 精品动漫3d一区二区三区免费| 国产精品va在线播放| 蜜臀久久久99精品久久久久久| 欧美一区在线看| 亚洲欧美成人一区二区三区| 91久久久久久| 欧美成人69| 欧美激情视频在线免费观看 欧美视频免费一 | 亚洲一区二区三区久久| 午夜精品一区二区三区在线 | 久久人人97超碰精品888| 一区二区三区欧美| 欧美不卡在线| 亚洲理伦在线| 99亚洲一区二区| 中文在线一区| 亚洲一区在线看| 欧美在线观看你懂的| 性视频1819p久久| 久久夜色精品国产亚洲aⅴ | 91久久久国产精品| 亚洲精品中文字幕有码专区| 亚洲人成网站色ww在线| 中文国产一区| 久久久久久久性| 嫩草影视亚洲| 亚洲精品一区二区三区av| 亚洲色图制服丝袜| 欧美在线视频免费观看| 欧美激情亚洲激情| 国产欧美一区二区三区另类精品| 一区二区视频欧美| 亚洲精品五月天| 久久精品欧美| 99精品视频网| 鲁大师影院一区二区三区| 欧美日韩中文字幕日韩欧美| 国产日韩一区二区三区在线播放 | 欧美一区二区三区婷婷月色 | 亚洲第一黄网| 午夜国产精品影院在线观看| 亚洲电影av在线| 亚洲欧美日韩电影|