• <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ù)加載中……

            類(lèi)型特化 -- Type-traits

            個(gè)人理解這個(gè)東西說(shuō)白了就是當(dāng)模板類(lèi)(或函數(shù))的類(lèi)型參數(shù)為某特定值時(shí)用對(duì)應(yīng)的特化定義代之。

              看個(gè)例子吧

             

            #include <iostream>

            using namespace std;

            template<typename T>

            struct is_void

            {

               static const bool value = false;

            };

            /* 上面的代碼定義了一個(gè)簡(jiǎn)單的模板結(jié)構(gòu)is_void的主版本,無(wú)論類(lèi)型參數(shù)T是何值,

             * 結(jié)構(gòu)體的靜態(tài)常量成員value的值都是false,這當(dāng)然是無(wú)意義的,我們需要當(dāng)且

             * 僅當(dāng)類(lèi)型參數(shù)Tvoid時(shí),value成員的值為true,于是我們定義下面的特化版本

             * /

            template<>

            struct is_void<void>

            {

               static const bool value = true;

            };

            /* 這里定義了一個(gè)is_void結(jié)構(gòu)體的特化版本,將類(lèi)型參數(shù)T固定為void,此時(shí)value

             * 成員的值被設(shè)定為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

             

            以上代碼中,當(dāng)is_void結(jié)構(gòu)體的模板類(lèi)型參數(shù)T被指定時(shí),編譯器將檢查該結(jié)構(gòu)體的主版本及所有特化版本,如果類(lèi)型參數(shù)與某一特化版本匹配,則該特化版本將被調(diào)用,如果沒(méi)有匹配的特化版本,則調(diào)用主版本。也就是說(shuō)如果T的實(shí)參為void,與我們定義的特化版本的參數(shù)一至,則此特化版本的定義被應(yīng)用,如果T不是void則按主版本的定義展開(kāi)。

             

            上面的例子屬于全特化(full-specialisation),也就是所有的類(lèi)型參數(shù)都被確定為實(shí)際類(lèi)型,但有時(shí)我們可以需要對(duì)參數(shù)進(jìn)行部分而不是完全的限定,這便是偏特化(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;

            };

             

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

             

            再來(lái)一個(gè)怪異一點(diǎn)的例子

            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也就是將一個(gè)數(shù)組類(lèi)型的[n]去掉即得到其基礎(chǔ)類(lèi)型,如果是非數(shù)組類(lèi)型則返回原類(lèi)型。于是上面的例子中,a是個(gè)int類(lèi)型的變量,而b也是int類(lèi)型,c有點(diǎn)怪,它不是int[5]類(lèi)型,而是int[6]類(lèi)型。這個(gè)例子也說(shuō)明一個(gè)問(wèn)題,特化版本與主版本的類(lèi)型參數(shù)不一定一樣,但typename修飾的類(lèi)型參數(shù)個(gè)數(shù)是一致的。

             

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

            狠狠色丁香久久婷婷综合图片| 久久精品国产亚洲AV无码偷窥 | 国产精品一区二区久久精品涩爱| 久久国产成人午夜aⅴ影院| 精品久久久久久99人妻| 狠狠色丁香久久婷婷综合蜜芽五月 | 久久亚洲国产午夜精品理论片| 国产亚州精品女人久久久久久 | 国产亚洲精久久久久久无码77777| 东方aⅴ免费观看久久av| 国产成年无码久久久久毛片| 国产精品美女久久久久av爽| 人妻无码精品久久亚瑟影视 | 亚洲色欲久久久久综合网| av色综合久久天堂av色综合在 | 99国产精品久久久久久久成人热| 国内精品免费久久影院| 久久人人爽人人爽人人AV | 久久久久久夜精品精品免费啦| 久久综合久久综合久久综合| 久久久久久久波多野结衣高潮 | 久久综合一区二区无码| 91精品国产乱码久久久久久| 国产成人精品三上悠亚久久| 久久久久亚洲爆乳少妇无| 狠狠色丁香久久综合婷婷| 亚洲精品无码成人片久久| 无码任你躁久久久久久| 九九热久久免费视频| 91久久九九无码成人网站| 色噜噜狠狠先锋影音久久| 久久亚洲精品无码AV红樱桃| 精品人妻伦九区久久AAA片69| 伊人 久久 精品| 亚洲欧美国产日韩综合久久| 久久国产三级无码一区二区| 国产99久久九九精品无码| 99久久婷婷国产综合精品草原 | 99久久精品日本一区二区免费| 2021国产精品午夜久久| 一本色道久久综合狠狠躁篇 |