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


            實現(xiàn)
               位于Loki::TL命名空間,利用遞歸計算最值結(jié)果,使用宏生成主類模板和特化類模板,其中后綴為DEFN(N為正整數(shù))形式的宏中N表示特化類模板所帶的模板參數(shù)數(shù)量,使用DEF1宏定義對應(yīng)的特化類模板的原因在于:當Typelist中存在非NullType類型時,保證結(jié)果的正確性。當N為2時參數(shù)取值: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)

               最大(小)長度
               對應(yīng)類主模板分別為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

               最大(小)類型
               對應(yīng)類主模板分別為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宏來做編譯期診斷結(jié)果正確性。
             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 春秋十二月 閱讀(1898) 評論(2)  編輯 收藏 引用 所屬分類: C/C++

            評論:
            # re: 關(guān)于Loki中Typelist的一點擴展 2012-05-29 11:20 | 空明流轉(zhuǎn)
            用MPL吧。。。loki在設(shè)計上很不成熟,遠不如MPL來的系統(tǒng)化。。。  回復(fù)  更多評論
              
            # re: 關(guān)于Loki中Typelist的一點擴展[未登錄] 2012-05-29 16:55 | 春秋十二月
            @空明流轉(zhuǎn)
            都用過
              回復(fù)  更多評論
              
            一本久久综合亚洲鲁鲁五月天| 国产精品免费久久久久影院| 精品伊人久久大线蕉色首页| 久久99国产一区二区三区| 欧美伊人久久大香线蕉综合69 | 亚洲AV无码成人网站久久精品大| 亚洲国产精品无码久久SM| 久久99国产亚洲高清观看首页| 久久久久国产成人精品亚洲午夜| 亚洲AV无码一区东京热久久 | 亚洲精品无码久久久久sm| 久久精品草草草| 色狠狠久久AV五月综合| 国产成人香蕉久久久久| 精品少妇人妻av无码久久| 麻豆久久| 91精品国产综合久久四虎久久无码一级 | 无码国产69精品久久久久网站| 青青青伊人色综合久久| 99精品国产99久久久久久97| 精品熟女少妇aⅴ免费久久| 久久精品99久久香蕉国产色戒| 色悠久久久久久久综合网| 久久精品成人免费网站| 久久99精品久久久久婷婷| 中文字幕无码久久人妻| 久久国产精品一区| 亚洲一本综合久久| 国内精品久久久久影院免费| 久久综合狠狠综合久久综合88| 国内精品久久久久影院老司| 麻豆国内精品久久久久久| 久久久久99精品成人片牛牛影视| 97精品国产97久久久久久免费 | 麻豆精品久久久久久久99蜜桃| 久久男人中文字幕资源站| 国产高清国内精品福利99久久| 国产精品女同一区二区久久| 国产精自产拍久久久久久蜜| 精品久久久久久无码中文字幕| 九九热久久免费视频|