• <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>
            隨筆-161  評論-223  文章-30  trackbacks-0
               本文就Loki編譯期技術中的類型列表Typelist作了一些擴展,增加了以下幾個方法:
                  • 獲取最大和最小長度,即求取Typelist中長度最大和最小的值  
                  • 獲取最大和最小類型,即求取Typelist中長度最大和最小的類型


            實現
               位于Loki::TL命名空間,利用遞歸計算最值結果,使用宏生成主類模板和特化類模板,其中后綴為DEFN(N為正整數)形式的宏中N表示特化類模板所帶的模板參數數量,使用DEF1宏定義對應的特化類模板的原因在于:當Typelist中存在非NullType類型時,保證結果的正確性。當N為2時參數取值:name為Max則b為true;name為Min則b為false。
               主類模板
               用于定義MaxSize、MinSize和MaxType、MinType主類模板,使用宏LOKI_TYPELIST_METHOD_DEF生成。 
            1    #define LOKI_TYPELIST_METHOD_DEF(name)\
            2    template <class TList>\
            3    struct name;\
            4    
            5    LOKI_TYPELIST_METHOD_DEF(MaxSize)
            6    LOKI_TYPELIST_METHOD_DEF(MinSize)
            7    LOKI_TYPELIST_METHOD_DEF(MaxType)
            8    LOKI_TYPELIST_METHOD_DEF(MinType)

               最大(小)長度
               對應類主模板分別為MaxSize和MinSize,每種有3個特化模板,使用宏LOKI_TYPELIST_SIZE_SPEC_DEFN生成(N為0、1、2)。
             1    #define LOKI_TYPELIST_SIZE_SPEC_DEF0(name)\
             2    template<>\
             3    struct name##Size<NullType>\
             4    {\
             5        enum { value = 0 };\
             6    }
            ;\
             7    
             8    #define LOKI_TYPELIST_SIZE_SPEC_DEF1(name)\
             9    template<class T>\
            10    struct name##Size<Typelist<T,NullType> >\
            11    {\
            12        enum { value = sizeof(T) };\
            13    }
            ;\
            14    
            15    #define LOKI_TYPELIST_SIZE_SPEC_DEF2(name,b)\
            16    template<class T,class U>\
            17    struct name##Size<Typelist<T,U> >\
            18    {\
            19        enum { tmp = name##Size<U>::value };\
            20        enum { value = (b ? sizeof(T) > tmp : sizeof(T) < tmp) ? sizeof(T) : tmp };\
            21    }
            ;\
            22    
            23    LOKI_TYPELIST_SIZE_SPEC_DEF0(Max)
            24    LOKI_TYPELIST_SIZE_SPEC_DEF0(Min)
            25    LOKI_TYPELIST_SIZE_SPEC_DEF1(Max)
            26    LOKI_TYPELIST_SIZE_SPEC_DEF1(Min)
            27    LOKI_TYPELIST_SIZE_SPEC_DEF2(Max,true)
            28    LOKI_TYPELIST_SIZE_SPEC_DEF2(Min,false)
            29    
            30    #undef LOKI_TYPELIST_SIZE_SPEC_DEF0
            31    #undef LOKI_TYPELIST_SIZE_SPEC_DEF1
            32    #undef LOKI_TYPELIST_SIZE_SPEC_DEF2

               最大(小)類型
               對應類主模板分別為MaxType和MinType,每種有3個特化模板,使用宏LOKI_TYPELIST_TYPE_SPEC_DEFN生成(N為0、1、2)。   
             1    #define LOKI_TYPELIST_TYPE_SPEC_DEF0(name)\
             2    template<>\
             3    struct name##Type<NullType>\
             4    {\
             5        typedef NullType type;\
             6    }
            ;\
             7    
             8    #define LOKI_TYPELIST_TYPE_SPEC_DEF1(name)\
             9    template<class T>\
            10    struct name##Type<Typelist<T,NullType> >\
            11    {\
            12        typedef T type;\
            13    }
            ;\
            14    
            15    #define LOKI_TYPELIST_TYPE_SPEC_DEF2(name,b)\
            16    template<class T,class U>\
            17    struct name##Type<Typelist<T,U> >\
            18    {\
            19        typedef typename name##Type<U>::type R;\
            20        typedef typename Select< b ? (sizeof(T)>sizeof(R)) : (sizeof(T)<sizeof(R)),T,R>::Result type;\
            21    }
            ;\
            22    
            23    LOKI_TYPELIST_TYPE_SPEC_DEF0(Max)
            24    LOKI_TYPELIST_TYPE_SPEC_DEF0(Min)
            25    LOKI_TYPELIST_TYPE_SPEC_DEF1(Max)
            26    LOKI_TYPELIST_TYPE_SPEC_DEF1(Min)
            27    LOKI_TYPELIST_TYPE_SPEC_DEF2(Max,true)
            28    LOKI_TYPELIST_TYPE_SPEC_DEF2(Min,false)
            29    
            30    #undef LOKI_TYPELIST_TYPE_SPEC_DEF0
            31    #undef LOKI_TYPELIST_TYPE_SPEC_DEF1
            32    #undef LOKI_TYPELIST_TYPE_SPEC_DEF2
               這里用到了Loki中的Select組件來選擇類型。

            示例
               使用LOKI中的LOKI_STATIC_CHECK宏來做編譯期診斷結果正確性。
             1#define LOKI_TL4 LOKI_TYPELIST_4(double,int,short,char) 
             2
             3int main(int argc,char *argv[])
             4{
             5    static const int max_val = Loki::TL::MaxSize<LOKI_TL4 >::value;
             6    LOKI_STATIC_CHECK(max_val==sizeof(double),max_val_should_be_sizeof_double)
             7
             8    static const int min_val = Loki::TL::MinSize<LOKI_TL4 >::value;
             9    LOKI_STATIC_CHECK(min_val==sizeof(char),min_val_should_be_sizeof_char)
            10
            11    typedef Loki::TL::MaxType<LOKI_TL4 >::type max_type;
            12    LOKI_STATIC_CHECK((Loki::IsSameType<max_type,double>::value),max_type_should_be_double)
            13
            14    typedef Loki::TL::MinType<LOKI_TL4 >::type min_type;
            15    LOKI_STATIC_CHECK((Loki::IsSameType<min_type,char>::value),min_type_should_be_char)
            16
            17    return 0;
            18}
            posted on 2012-05-29 01:03 春秋十二月 閱讀(1905) 評論(2)  編輯 收藏 引用 所屬分類: C/C++

            評論:
            # re: 關于Loki中Typelist的一點擴展 2012-05-29 11:20 | 空明流轉
            用MPL吧。。。loki在設計上很不成熟,遠不如MPL來的系統化。。。  回復  更多評論
              
            # re: 關于Loki中Typelist的一點擴展[未登錄] 2012-05-29 16:55 | 春秋十二月
            @空明流轉
            都用過
              回復  更多評論
              
            三级韩国一区久久二区综合| 香蕉久久av一区二区三区| 久久人做人爽一区二区三区| 亚洲精品tv久久久久久久久久| 2021国产精品久久精品| 久久99热精品| 欧美成a人片免费看久久| 欧美一区二区三区久久综| 狠狠精品久久久无码中文字幕| 人人狠狠综合久久亚洲高清| 要久久爱在线免费观看| 久久99国产综合精品免费| 97精品依人久久久大香线蕉97| 久久久久一本毛久久久| 日产精品久久久久久久性色| 久久996热精品xxxx| 国产成人精品免费久久久久| 亚州日韩精品专区久久久| 99久久精品国产综合一区| 久久99精品久久久久久久久久| 久久国产高清一区二区三区| 欧美丰满熟妇BBB久久久| 久久精品国产99久久久古代| 国内精品久久久久久久涩爱| 久久免费精品视频| 91精品日韩人妻无码久久不卡| 亚洲综合伊人久久综合| 精品伊人久久久| 亚洲乱码日产精品a级毛片久久 | 伊人久久无码中文字幕| 欧美伊人久久大香线蕉综合69| 国产激情久久久久影院老熟女 | 国产精品99久久久久久猫咪| 久久夜色精品国产网站| 久久久亚洲欧洲日产国码二区| 久久99精品久久久久久久不卡| 久久丫忘忧草产品| 国产精品99久久久精品无码| 日韩人妻无码精品久久久不卡| 蜜臀久久99精品久久久久久小说 | 久久亚洲精品国产亚洲老地址|