• <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 | 春秋十二月
            @空明流轉
            都用過
              回復  更多評論
              
            久久夜色精品国产| 亚洲色大成网站WWW久久九九| 亚洲国产欧洲综合997久久| 99精品国产99久久久久久97| 久久精品中文无码资源站| 成人国内精品久久久久影院VR| 亚洲а∨天堂久久精品| 狼狼综合久久久久综合网| 国产—久久香蕉国产线看观看| 热综合一本伊人久久精品| 人妻少妇久久中文字幕一区二区| 国产福利电影一区二区三区久久老子无码午夜伦不 | 久久线看观看精品香蕉国产| 久久se精品一区二区影院| 国内精品久久久久影院薰衣草| 四虎国产永久免费久久| 亚洲欧美日韩中文久久| 青青青青久久精品国产h久久精品五福影院1421| 国色天香久久久久久久小说| 精品久久久久中文字幕一区| 婷婷久久香蕉五月综合加勒比| 丁香五月综合久久激情| 精品一区二区久久| 久久国产热精品波多野结衣AV| 久久只这里是精品66| 欧美亚洲日本久久精品| 91久久精品国产成人久久| 久久精品人人槡人妻人人玩AV| 波多野结衣久久一区二区| 久久精品中文字幕一区| 91精品日韩人妻无码久久不卡| 久久精品无码午夜福利理论片 | 欧美午夜A∨大片久久 | 久久久久久精品免费免费自慰| 久久99热精品| 狼狼综合久久久久综合网| 亚洲综合伊人久久大杳蕉| 久久夜色精品国产亚洲| 久久99毛片免费观看不卡| 久久免费视频网站| 99久久精品九九亚洲精品|