• <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ù)  更多評論
              
            色偷偷88欧美精品久久久| www亚洲欲色成人久久精品| 国产精品99久久精品爆乳| 韩国三级中文字幕hd久久精品| 色婷婷综合久久久久中文字幕| 欧美午夜精品久久久久久浪潮| 中文字幕热久久久久久久| 久久久久久无码国产精品中文字幕| 久久久久久久97| 久久久久av无码免费网| 久久精品这里只有精99品| 国产69精品久久久久9999APGF| 99久久人妻无码精品系列蜜桃| 久久久婷婷五月亚洲97号色 | 三级片免费观看久久| 77777亚洲午夜久久多喷| 久久精品一区二区三区不卡| 精品久久亚洲中文无码| 国产成人精品久久亚洲| 色欲综合久久躁天天躁蜜桃| 一本一道久久综合狠狠老| 国产免费久久精品丫丫| www久久久天天com| 老男人久久青草av高清| 久久久久久久久久久精品尤物| 色综合久久久久| 久久久久四虎国产精品| 久久精品亚洲日本波多野结衣| 久久久久久久波多野结衣高潮| 久久精品国产一区二区三区不卡| 日产精品久久久久久久性色| 久久精品亚洲精品国产色婷| 国产免费久久精品99re丫y| 激情五月综合综合久久69| 久久99精品国产麻豆宅宅 | 国产精品亚洲综合专区片高清久久久 | 精品国产99久久久久久麻豆| 2021国内久久精品| 久久综合九色综合网站| 久久狠狠爱亚洲综合影院| 99精品国产综合久久久久五月天|