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

牧光小院

被約束的日日夜夜,停不下來(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 閱讀(2413) 評(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)論   

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

導(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>
            亚洲精品视频一区| 亚洲综合欧美| 欧美日韩一区二区国产| 欧美精品国产| 欧美久久久久久| 欧美视频在线一区| 国产精品一区二区在线观看网站| 国产精品一区二区欧美| 国产一区二区三区在线观看视频 | 亚洲精品在线观| 亚洲视频日本| 久久精品首页| 欧美日本在线看| 国产精品三级久久久久久电影| 国产真实乱偷精品视频免| 亚洲韩国日本中文字幕| 亚洲午夜女主播在线直播| 久久久99精品免费观看不卡| 欧美激情精品久久久久久黑人| 日韩视频在线一区二区三区| 欧美亚洲一级| 欧美久久99| 玉米视频成人免费看| 亚洲一区精品电影| 免费成人高清视频| 亚洲欧美在线免费观看| 欧美精品二区三区四区免费看视频| 国产精品久久久久影院亚瑟 | 欧美日韩综合不卡| 国内精品久久久久伊人av| 一区二区激情视频| 你懂的一区二区| 欧美一区二区三区久久精品茉莉花 | 亚洲精品小视频在线观看| 欧美一乱一性一交一视频| 欧美国产欧美亚州国产日韩mv天天看完整| 欧美日韩在线三级| 亚洲国产岛国毛片在线| 久久精品成人一区二区三区蜜臀| 亚洲成人在线免费| 亚洲小说春色综合另类电影| 欧美成人蜜桃| 久久精品99无色码中文字幕| 欧美午夜电影网| 一区二区三区久久| 亚洲国产日韩一区| 久久精品理论片| 国产欧美一区二区在线观看| 亚洲午夜精品| 日韩视频精品| 欧美日韩国产成人在线观看| 亚洲人成人77777线观看| 欧美va亚洲va国产综合| 久久久精彩视频| 激情欧美一区二区| 久久亚洲一区| 久久精品一二三区| 伊人婷婷久久| 欧美成人一区在线| 欧美jizz19性欧美| 亚洲日本激情| 亚洲激情av在线| 欧美精品一区在线发布| 日韩视频久久| 一区二区高清视频在线观看| 国产精品xvideos88| 亚洲一区视频在线| 亚洲你懂的在线视频| 国产热re99久久6国产精品| 久久九九国产精品| 久久视频在线看| 亚洲精品网站在线播放gif| 亚洲国产欧美一区| 欧美日韩在线不卡一区| 亚洲欧美日本国产专区一区| 西西裸体人体做爰大胆久久久| 国产在线视频不卡二| 欧美h视频在线| 欧美日韩人人澡狠狠躁视频| 亚洲永久免费| 久久成人精品无人区| 亚洲国产成人高清精品| 亚洲精品综合久久中文字幕| 国产精品国产三级国产aⅴ无密码| 欧美一区激情| 免费看av成人| 亚洲欧美另类在线| 久久亚洲私人国产精品va| 夜夜嗨av一区二区三区中文字幕| 99精品久久| 一区精品在线播放| 亚洲精品小视频在线观看| 国产欧美日韩中文字幕在线| 欧美激情久久久久| 国产精品一卡二卡| 亚洲国产精品女人久久久| 国产精品激情电影| 欧美va亚洲va日韩∨a综合色| 欧美日韩国产一中文字不卡| 欧美在线视频a| 欧美激情精品久久久久久大尺度| 性欧美1819sex性高清| 亚洲片国产一区一级在线观看| 欧美日韩另类字幕中文| 久久久久久穴| 欧美日韩午夜| 欧美国产一区二区在线观看| 国产精品国产三级国产aⅴ浪潮| 欧美大片免费久久精品三p| 国产精品午夜电影| 日韩图片一区| 亚洲精品视频一区| 久久亚洲私人国产精品va媚药| 亚洲一区视频| 欧美日本高清| 欧美好吊妞视频| 精品动漫av| 欧美一站二站| 久久国产免费| 国产欧美精品va在线观看| 99国产精品久久久久久久久久| 亚洲福利视频在线| 久久激情五月婷婷| 久久久99久久精品女同性| 国产精品久久久久影院亚瑟 | 国产精品精品视频| 亚洲国产日韩欧美在线99| 在线免费日韩片| 久久精品综合| 美日韩精品免费观看视频| 国产一区二区三区高清在线观看| 亚洲影院色在线观看免费| 亚洲网在线观看| 欧美日韩亚洲国产精品| 国产欧美va欧美va香蕉在| 在线视频日本亚洲性| 一区二区三区日韩| 欧美激情视频一区二区三区免费 | 亚洲国产91精品在线观看| 一区二区视频在线观看| 久久久久99| 欧美激情第9页| 亚洲黄色天堂| 欧美日本免费一区二区三区| 亚洲久久在线| 亚洲综合色视频| 国产精品有限公司| 欧美一站二站| 欧美国产日韩一区二区在线观看 | 中文成人激情娱乐网| 欧美天天综合网| 欧美一区二区啪啪| 欧美大片在线观看一区| 99av国产精品欲麻豆| 欧美日韩亚洲另类| 午夜精品国产| 欧美激情偷拍| 亚洲免费影院| 在线播放中文一区| 欧美日韩国产色综合一二三四| 亚洲一区二区精品在线| 久久影院亚洲| 中日韩美女免费视频网址在线观看 | 欧美午夜精品久久久久久孕妇| 亚洲图中文字幕| 久久久亚洲国产美女国产盗摄| 亚洲精品欧洲| 免费中文日韩| 欧美成年人视频网站| 一二三区精品| 国产视频一区三区| 欧美电影在线观看| 亚洲一区二区三区高清不卡| 久久综合狠狠综合久久综合88| 亚洲欧洲精品天堂一级| 国产精品久久久久一区二区三区共 | 一区二区三区导航| 国产日韩欧美电影在线观看| 欧美成人在线免费视频| 午夜精品区一区二区三| 欧美国产日韩一区| 欧美尤物巨大精品爽| 日韩亚洲欧美中文三级| 国语自产精品视频在线看一大j8 | 欧美激情精品久久久久久免费印度| 一本色道久久综合亚洲精品婷婷| 国产欧美日韩三区| 欧美精品一区二区三区一线天视频 | 欧美韩日视频| 久久久91精品国产| 亚洲在线视频观看| 亚洲伦理自拍| 亚洲国产电影| 国产偷自视频区视频一区二区| 欧美日韩高清一区| 欧美刺激性大交免费视频 | 国产日产亚洲精品| 欧美性做爰毛片| 欧美激情一区二区三区在线| 久久久女女女女999久久|