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

            文章均收錄自他人博客,但不喜標題前加-[轉貼],因其丑陋,見諒!~
            隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
            數據加載中……

            類型特化 -- Type-traits

            個人理解這個東西說白了就是當模板類(或函數)的類型參數為某特定值時用對應的特化定義代之。

              看個例子吧

             

            #include <iostream>

            using namespace std;

            template<typename T>

            struct is_void

            {

               static const bool value = false;

            };

            /* 上面的代碼定義了一個簡單的模板結構is_void的主版本,無論類型參數T是何值,

             * 結構體的靜態常量成員value的值都是false,這當然是無意義的,我們需要當且

             * 僅當類型參數Tvoid時,value成員的值為true,于是我們定義下面的特化版本

             * /

            template<>

            struct is_void<void>

            {

               static const bool value = true;

            };

            /* 這里定義了一個is_void結構體的特化版本,將類型參數T固定為void,此時value

             * 成員的值被設定為true

             * /

             

            int main(int argc, char* argv[])

            {

               cout << is_void<void>::value << endl;

               cout << is_void<int>::value << endl;

               cout << is_void<bool>::value << endl;

               return 0;

            }

             

            這段代碼輸出為:

            1

            0

            0

             

            以上代碼中,當is_void結構體的模板類型參數T被指定時,編譯器將檢查該結構體的主版本及所有特化版本,如果類型參數與某一特化版本匹配,則該特化版本將被調用,如果沒有匹配的特化版本,則調用主版本。也就是說如果T的實參為void,與我們定義的特化版本的參數一至,則此特化版本的定義被應用,如果T不是void則按主版本的定義展開。

             

            上面的例子屬于全特化(full-specialisation),也就是所有的類型參數都被確定為實際類型,但有時我們可以需要對參數進行部分而不是完全的限定,這便是偏特化(partial template-class specialisation)。

            看下面的例子

             

            template<typename T>

            struct is_pointer

            {

               static const bool value = false;

            };

            template<typename T>

            struct is_pointer<T*>

            {

               static const bool value = true;

            };

             

            這個例子中我們試圖判斷模板參數T是否是指針類型,如果是則value成員設為true,如果不是則置為false。然而無論T是不是指針都不可能被一一列舉,也就是我們不能像第一個例子一樣對諸如void*, int*, long*, char* .... 等等等等一一特化,這工作量太嚇人了,我要需要一種方式來將指針的情況一次性特化,這就是例子中應用的方式:偏特化。偏特化的寫法我想不難理解,但注意兩個版本中的T是不一樣的,我們可以把特化版本的T換成T2是沒有問題的,這時對于is_pointer<int*>來講,T代表int*,而T2代表的只是int,大家可以揣摩一下。這也就間接說明了主版本和特化版本允許不同個數的模板參數的原因。

             

            再來一個怪異一點的例子

            template <typename T>

            struct remove_bounds

            {

               typedef T type;

            };

            template <typename T, size_t N>

            struct remove_bounds<T[N]>

            {

               typedef T type;

            };

            remove_bounds<int>::type a;

            remove_bounds<int[5]>::type b;

            remove_bounds<int[5][6]>::type c;

             

            remove_bounds也就是將一個數組類型的[n]去掉即得到其基礎類型,如果是非數組類型則返回原類型。于是上面的例子中,a是個int類型的變量,而b也是int類型,c有點怪,它不是int[5]類型,而是int[6]類型。這個例子也說明一個問題,特化版本與主版本的類型參數不一定一樣,但typename修飾的類型參數個數是一致的。

             

            posted on 2008-11-08 22:57 肥仔 閱讀(450) 評論(0)  編輯 收藏 引用 所屬分類: C++ 模板

            久久久久久久久波多野高潮| 久久精品国产亚洲Aⅴ蜜臀色欲| 亚洲va久久久久| 久久久久亚洲AV成人网人人网站 | 一本一道久久a久久精品综合 | 久久精品嫩草影院| 久久综合精品国产一区二区三区 | 久久久精品波多野结衣| 久久久久人妻精品一区二区三区 | 国内精品欧美久久精品| 亚洲AV无码久久精品成人| 久久人人爽人人澡人人高潮AV| 久久99热只有频精品8| 久久99热这里只频精品6| 国产精品日韩深夜福利久久| 久久99精品久久久久久hb无码| 午夜肉伦伦影院久久精品免费看国产一区二区三区 | 国内精品久久久久影院优| 青青青青久久精品国产h久久精品五福影院1421 | 国产精品美女久久福利网站| 国产免费久久精品丫丫| 国产精品对白刺激久久久| 成人综合久久精品色婷婷| 久久精品亚洲精品国产欧美| 一本久久久久久久| 日本精品久久久中文字幕| 国产精品久久国产精品99盘| 精品久久久久久国产潘金莲| 亚洲va久久久噜噜噜久久| 亚洲国产精品无码成人片久久| 伊人久久精品无码av一区| 久久免费视频一区| 国产午夜精品久久久久免费视 | 青青草原综合久久大伊人导航 | 热re99久久6国产精品免费| 久久综合九色综合网站| 国产亚洲美女精品久久久2020| 区久久AAA片69亚洲| 亚洲av日韩精品久久久久久a| 久久亚洲AV无码精品色午夜| 久久婷婷五月综合色奶水99啪|