• <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>

            woaidongmao

            文章均收錄自他人博客,但不喜標(biāo)題前加-[轉(zhuǎn)貼],因其丑陋,見(jiàn)諒!~
            隨筆 - 1469, 文章 - 0, 評(píng)論 - 661, 引用 - 0
            數(shù)據(jù)加載中……

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

            我們可以用不同的整數(shù)來(lái)實(shí)例化同一個(gè)模板,從而構(gòu)造不同的類(lèi)型,進(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 都代表不同的類(lèi)型。這是因?yàn)椴煌哪0鎸?shí)例化都代表不同的類(lèi)型,也就是說(shuō) Int2Type<0> Int2Type<1> 是完全不同的。

            當(dāng)你想根據(jù)編譯時(shí)結(jié)果來(lái)進(jìn)行某些抉擇——例如選擇不同的函數(shù)——時(shí),你可以依賴(lài)一個(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í)它們卻不能滿(mǎn)足你的要求。既是是在編譯期可以決定其分支,編譯器還是會(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)類(lèi)型)或者一個(gè)名為 Clone() 的虛函數(shù)(對(duì)于多態(tài)類(lèi)型)。你可以通過(guò)設(shè)置一個(gè) bool 類(lèi)型的模版參數(shù)來(lái)從類(lèi)的客戶(hù)手里獲得關(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)類(lè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)類(lèi)型分支,也有可能發(fā)生編譯錯(cuò)誤。如果 T 是一個(gè)多態(tài)類(lèi)型,并且把它的拷貝構(gòu)造函數(shù)設(shè)定為 private 的時(shí)候(這時(shí)一個(gè)多態(tài)類(lèi)的良好行為),非多態(tài)分支的 new T(*pObj) 就會(huì)發(fā)生錯(cuò)誤。

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

            其實(shí),方法有很多, Int2Type 提供了一個(gè)簡(jiǎn)潔的辦法。它可以根據(jù) true false 來(lái)生成兩個(gè)不同的類(lèi)型,而后根據(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è)類(lèi)型的時(shí)候, Int2Type 是非常方便的。你可以傳遞一個(gè)臨時(shí)的變量來(lái)重載函數(shù)。而之所以我們可以這樣做,是因?yàn)榫幾g器不會(huì)去編譯沒(méi)有用到的模板函數(shù)。

            Feedback

            # re: C++的靜態(tài)分派技術(shù)  回復(fù)  更多評(píng)論  

            2005-11-15 16:36 by christanxw
            這在STL中有著廣泛的應(yīng)用

            posted on 2008-09-15 13:42 肥仔 閱讀(448) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): C++ 模板

            亚洲国产成人久久综合碰| 日产精品99久久久久久| 国产精品中文久久久久久久| 久久亚洲国产成人影院网站 | 久久久久久国产a免费观看不卡 | 亚洲精品综合久久| 久久国产精品成人片免费| 国产精品午夜久久| 一本久久精品一区二区| 久久被窝电影亚洲爽爽爽| 久久综合狠狠综合久久97色| 国产欧美久久久精品影院| 伊人丁香狠狠色综合久久| 人妻无码久久一区二区三区免费| 国产99久久久国产精免费| 久久人爽人人爽人人片AV | 人妻丰满?V无码久久不卡| 日本久久久久久中文字幕| 精品少妇人妻av无码久久| 久久99热国产这有精品| 久久国产精品一国产精品金尊| 2021国内久久精品| 欧美喷潮久久久XXXXx| 亚洲国产美女精品久久久久∴| 三级三级久久三级久久| 午夜精品久久久久久久| 久久久久青草线蕉综合超碰| 久久综合香蕉国产蜜臀AV| 久久久久亚洲av无码专区导航 | 久久久亚洲欧洲日产国码二区| 久久性生大片免费观看性| 久久久久高潮毛片免费全部播放 | 久久久久女教师免费一区| 久久精品女人天堂AV麻| 久久国产成人午夜aⅴ影院| 久久久av波多野一区二区| 久久精品国产一区| 粉嫩小泬无遮挡久久久久久| 亚洲中文字幕久久精品无码喷水 | 国内精品久久久久久不卡影院| 久久综合丝袜日本网|