• <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
            數據加載中……

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


             
            2.4 常整數映射為型別

            以下模板:

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


            Int2Type會根據引數所得的不同數值來產生不同型別。Int2Type<0> 和 Int2Type<1>是兩種不同的類型。采用Int2Type可根據編譯期計算出來的結果選用不同的函數。實際上你可以運用一個常數達到靜態分派功能。

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

            a.有必要根據某個編譯期常數調用一個或數個不同的函數。
            b.有必要在編譯期實施“分派”。

            運行時分派可以使用if...else...或switch。但有時難以做到。舉例如下:

            假設一個容器NiftyContainer,

            1 template <class T> class NiftyContainer{};


            其內含指針,指向 T 的對象。為了復制容器中某個對象,你想調用copy構造函數(非多態)或虛函數Clone()(多態)。但你無法這樣做:

             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 };


            你會發現編譯不過,編譯器會發現未定義的函數。而Int2Type提供了一個辦法:

             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 };


            主要原因是編譯器不會去編譯一個未被用到的template函數。
             

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

            久久99精品久久只有精品| 久久综合综合久久狠狠狠97色88 | 久久国产成人精品麻豆| 伊人久久免费视频| 美女久久久久久| 少妇无套内谢久久久久| 久久婷婷是五月综合色狠狠| 久久精品国产亚洲av麻豆色欲 | 久久精品国产精品国产精品污 | 久久天天躁狠狠躁夜夜躁2O2O| www.久久精品| 亚洲色欲久久久久综合网| 国产成人无码久久久精品一| 久久久久久毛片免费看| 男女久久久国产一区二区三区 | 国产精品99久久久久久猫咪| 亚洲午夜久久久影院伊人| 国产精品免费久久久久久久久| 久久99精品久久久大学生| 久久99精品久久久久久水蜜桃| 色欲av伊人久久大香线蕉影院| 久久精品国产99久久香蕉| 久久精品a亚洲国产v高清不卡| 亚洲天堂久久久| 久久嫩草影院免费看夜色| 久久久九九有精品国产| 久久99国产综合精品女同| 国产精品久久久久久久人人看| 久久高清一级毛片| Xx性欧美肥妇精品久久久久久| 久久精品99久久香蕉国产色戒| 国产69精品久久久久APP下载| 久久精品国产亚洲精品| 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲 | 久久伊人五月丁香狠狠色| 久久婷婷五月综合成人D啪| 久久精品三级视频| 久久一区二区三区99| 久久久亚洲精品蜜桃臀 | 国内精品人妻无码久久久影院| 国产色综合久久无码有码|