• <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è)計新思維》讀書筆記(12)

            2.7 編譯期間偵測可轉(zhuǎn)換性和繼承性

            在泛型編程中,經(jīng)常遭遇一個問題:對于兩個型別TU,如何得知U是否繼承于T。我們需要在編譯時發(fā)現(xiàn)這樣的關(guān)系,而不必使用dynamic_cast——它會損耗執(zhí)行期效率。

            我們利用sizeof 重載函數(shù)。比如如下定義兩個類型,和兩個函數(shù),一個函數(shù)接收U類型,一個接收任意類型。

            1 typedef char Small;
            2 class Big {char dummy[2];};
            3 Small Test(U);
            4 Big Test();//省略號參數(shù)函數(shù)

            我們傳一個T類型對象給Test函數(shù),看它能不能轉(zhuǎn)換為U

            1 const bool convExists = sizeof(Test(T())) == sizeof(Small);

            但如果T的缺省構(gòu)造函數(shù)為私有,則會編譯失敗,所以我們用一個稻草人函數(shù)

            1 T MakeT();
            2 const bool convExists = sizeof(Test(MakeT())) == sizeof(Small);

            我們注意,sizeof()里面的東西不需要具現(xiàn),所以T對象,MakeT()Test()都不需要實(shí)作。它們根本不真正存在!!現(xiàn)在用class template包裝起來。

             1 template<class T, class U>
             2 class Conversion
             3 {
             4     typedef char Small;
             5     class Big {char dummy[2];};
             6     static Small Test(U);
             7     static Big Test();
             8     static T MakeT();
             9 public:
            10     // T可以轉(zhuǎn)換為U
            11     enum {exists = sizeof(Test(MakeT())) == sizeof(Small)};
            12     // 可以雙向轉(zhuǎn)換
            13     enum {exists2Way = exists && conversion<U, T>::exists };
            14     enum {sameType = false};
            15 };
            16 //利用偏特化處理 sameType == true 情況
            17 template<class T>
            18 class Conversion<T, T>
            19 {
            20 public:
            21     enum { exists = 1, exists2Way = 1, sameType = 1};
            22 };

            最后,我們可以根據(jù)這個來判斷兩個類之間是否有繼承關(guān)系:

            1 #define SUPER_SUB_CLASS(T, U)\
            2            (Conversion<const U*const T*>::exists &&\
            3            !Conversion<const T*const void*>::sameType)

            如果U是共有繼承于T,或者TU是同一型別,SUPER_SUB_CLASS(T, U)都傳回true。這里加上const飾詞的原因是,我們不希望因const而導(dǎo)致轉(zhuǎn)換失敗,對一個型別const兩次,第二個const會被忽略。

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

            亚洲国产成人乱码精品女人久久久不卡| 精品无码久久久久久午夜| 久久久久无码中| 无码国内精品久久人妻| 久久国产精品久久国产精品| 成人a毛片久久免费播放| 中文字幕精品无码久久久久久3D日动漫 | 99久久国产亚洲高清观看2024| 久久久久黑人强伦姧人妻| 久久精品中文騷妇女内射| 亚洲AⅤ优女AV综合久久久| 粉嫩小泬无遮挡久久久久久| 久久夜色精品国产噜噜亚洲a | 久久99热这里只有精品国产| 中文国产成人精品久久不卡| 久久精品?ⅴ无码中文字幕| 99re这里只有精品热久久| 久久久久久久久波多野高潮| 久久久人妻精品无码一区| 久久香蕉综合色一综合色88| 久久久噜噜噜久久中文福利| 亚洲日韩欧美一区久久久久我| 久久99精品国产麻豆不卡| 精品久久久久久| www.久久99| 国产精品99久久精品| 精品久久久久香蕉网| 久久香蕉超碰97国产精品| 伊人久久大香线蕉av不变影院| 久久亚洲AV成人无码软件| 国产精品久久婷婷六月丁香| 伊人久久成人成综合网222| 亚洲国产综合久久天堂| 久久国内免费视频| 久久久久亚洲AV无码观看 | 99久久婷婷国产一区二区| 久久中文娱乐网| 久久久久久无码国产精品中文字幕| 久久久久久久综合日本亚洲| 99久久免费只有精品国产| 久久久久久亚洲精品不卡|