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

            CG@CPPBLOG

            /*=========================================*/
            隨筆 - 76, 文章 - 39, 評論 - 137, 引用 - 0
            數(shù)據(jù)加載中……

            《C++設(shè)計(jì)新思維》讀書筆記(九)


             
            2.4 常整數(shù)映射為型別

            以下模板:

            1 template < int v >
            2 struct Int2Type{
            3     enum { value = v };
            4 }


            Int2Type會根據(jù)引數(shù)所得的不同數(shù)值來產(chǎn)生不同型別。Int2Type<0> 和 Int2Type<1>是兩種不同的類型。采用Int2Type可根據(jù)編譯期計(jì)算出來的結(jié)果選用不同的函數(shù)。實(shí)際上你可以運(yùn)用一個(gè)常數(shù)達(dá)到靜態(tài)分派功能。

            一般而言,符合下列兩個(gè)條件可使用Int2Type:

            a.有必要根據(jù)某個(gè)編譯期常數(shù)調(diào)用一個(gè)或數(shù)個(gè)不同的函數(shù)。
            b.有必要在編譯期實(shí)施“分派”。

            運(yùn)行時(shí)分派可以使用if...else...或switch。但有時(shí)難以做到。舉例如下:

            假設(shè)一個(gè)容器NiftyContainer,

            1 template <class T> class NiftyContainer{};


            其內(nèi)含指針,指向 T 的對象。為了復(fù)制容器中某個(gè)對象,你想調(diào)用copy構(gòu)造函數(shù)(非多態(tài))或虛函數(shù)Clone()(多態(tài))。但你無法這樣做:

             1 template < typename T, bool isPolymorphic>
             2 class NiftyContainer{
             3     void DoSomething(){
             4         T* pSomeObj = ;
             5         if (isPolymorphic){
             6             T* pNewObj = pSomeObje->Clone();
             7             //
             8         }else{
             9             T* pNewObj = new T(*pSomeObj);
            10             //
            11         }
            12 };


            你會發(fā)現(xiàn)編譯不過,編譯器會發(fā)現(xiàn)未定義的函數(shù)。而Int2Type提供了一個(gè)辦法:

             1 template <typename T, bool isPolymrphoic>
             2 class NiftyContainer{
             3 private:
             4     void DoSomething(T* pObj, Int2Type<true>){
             5         T* pNewObj = pSomeObje->Clone();
             6         //  
             7     }
             8     void DoSomething(T* pObj, Int2Type<false>){
             9         T* pNewObj = new T(*pSomeObj);
            10         //
            11     }
            12 public:
            13     void DoSomething(T* pObj){
            14         DoSomething(pObj, Int2Type<isPolymorphoic>());
            15     }
            16 };


            主要原因是編譯器不會去編譯一個(gè)未被用到的template函數(shù)。
             

            posted on 2007-12-17 22:15 cuigang 閱讀(279) 評論(0)  編輯 收藏 引用 所屬分類: 《C++設(shè)計(jì)新思維》讀書筆記

            人人妻久久人人澡人人爽人人精品| 久久这里有精品视频| 久久ZYZ资源站无码中文动漫| 国产精品久久久久久影院| 91精品日韩人妻无码久久不卡 | 久久免费国产精品一区二区| 国产精品亚洲综合专区片高清久久久| 久久久噜噜噜久久中文字幕色伊伊| 久久婷婷午色综合夜啪| 久久久国产乱子伦精品作者| 久久久99精品一区二区| 久久久久亚洲精品天堂| 久久亚洲国产成人精品无码区| 韩国无遮挡三级久久| 一本色道久久综合狠狠躁| 精品久久久久久久久久久久久久久 | 国产成人AV综合久久| AAA级久久久精品无码片| 久久午夜无码鲁丝片秋霞| 久久精品亚洲精品国产欧美| 一本久久a久久精品综合夜夜| 无码人妻久久一区二区三区免费 | 久久久av波多野一区二区| 香蕉久久夜色精品国产2020| 久久综合亚洲色HEZYO国产| 久久精品国产秦先生| 免费精品99久久国产综合精品| 色综合久久综合中文综合网| 亚洲精品无码久久久久AV麻豆| 久久久WWW成人免费精品| 久久99精品久久久久久水蜜桃| 人人狠狠综合久久亚洲婷婷| 国产精品久久精品| 狠色狠色狠狠色综合久久 | 99国产欧美久久久精品蜜芽| 久久青青草原精品国产| 狠狠色丁香久久婷婷综合五月| 色综合久久综合中文综合网| 精品久久久久中文字幕日本 | 久久亚洲AV无码西西人体| 午夜精品久久久久久|