青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Cpper
C/C++高級工程師 Android高級軟件工程師 IT集成工程師 音頻工程師 熟悉c,c++,java,c#,py,js,asp等多種語言 程序猿
Loki中的TypeList這塊是Loki中比較基礎(chǔ)的部分
其主要涉及類型鏈表(TypeList)
相關(guān)功能有
1.模板化得類型鏈表-最打提供18個類型參數(shù)
2.獲取類型鏈表的長度
3.獲取給定索引位置的參數(shù)類型
4.當(dāng)索引越界時獲取設(shè)定的參數(shù)類型
5.類型鏈表的類型增加和剔除
6.其他

下面是makeTypeList的代碼
 1       template
 2         <
 3             typename T1  = NullType, typename T2  = NullType, typename T3  = NullType,
 4             typename T4  = NullType, typename T5  = NullType, typename T6  = NullType,
 5             typename T7  = NullType, typename T8  = NullType, typename T9  = NullType,
 6             typename T10 = NullType, typename T11 = NullType, typename T12 = NullType,
 7             typename T13 = NullType, typename T14 = NullType, typename T15 = NullType,
 8             typename T16 = NullType, typename T17 = NullType, typename T18 = NullType
 9         > 
10         struct MakeTypelist
11         {
12         private:
13             typedef typename MakeTypelist
14             <
15                 T2 , T3 , T4 , 
16                 T5 , T6 , T7 , 
17                 T8 , T9 , T10, 
18                 T11, T12, T13,
19                 T14, T15, T16, 
20                 T17, T18
21             >
22             ::Result TailResult;
23 
24         public:
25             typedef Typelist<T1, TailResult> Result;
26         };
27 
28         template<>
29         struct MakeTypelist<>
30         {
31             typedef NullType Result;
32         };
她的作用是構(gòu)建一個模板參數(shù)不超過18個的類型鏈表
其中NullType是一種PlaceHolder
當(dāng)定義TypeList的模板參數(shù)不超過18個的時候 那么其余參數(shù)會被自動設(shè)置為NullType
這里提供了一個泛型版本和一個特化版本
當(dāng)使用MakeTypeList<>的時候就意味著模板參數(shù)是NullTYpe

構(gòu)建除了一個類型鏈表接下來就需要獲取類型鏈表的參數(shù)個數(shù)
如下所示:
 1 ////////////////////////////////////////////////////////////////////////////////
 2 // class template Length
 3 // Computes the length of a typelist
 4 // Invocation (TList is a typelist):
 5 // Length<TList>::value
 6 // returns a compile-time constant containing the length of TList, not counting
 7 //     the end terminator (which by convention is NullType)
 8 ////////////////////////////////////////////////////////////////////////////////
 9 
10         template <class TList> struct Length;
11         template <> struct Length<NullType>
12         {
13             enum { value = 0 };
14         };
15         
16         template <class T, class U>
17         struct Length< Typelist<T, U> >
18         {
19             enum { value = 1 + Length<U>::value };
20         };
21 
這里使用了典型的模板元遞歸
首先設(shè)置空的類型鏈表長度為0
然后獲取指定的類型鏈表長度

而TypeAt得功能是獲取類型鏈表中給定位置的元素類型
 1 ////////////////////////////////////////////////////////////////////////////////
 2 // class template TypeAt
 3 // Finds the type at a given index in a typelist
 4 // Invocation (TList is a typelist and index is a compile-time integral 
 5 //     constant):
 6 // TypeAt<TList, index>::Result
 7 // returns the type in position 'index' in TList
 8 // If you pass an out-of-bounds index, the result is a compile-time error
 9 ////////////////////////////////////////////////////////////////////////////////
10 
11         template <class TList, unsigned int index> struct TypeAt;
12         
13         template <class Head, class Tail>
14         struct TypeAt<Typelist<Head, Tail>0>
15         {
16             typedef Head Result;
17         };
18 
19         template <class Head, class Tail, unsigned int i>
20         struct TypeAt<Typelist<Head, Tail>, i>
21         {
22             typedef typename TypeAt<Tail, i - 1>::Result Result;
23         };

注意這里給定的索引不能超出類型鏈表的參數(shù)個數(shù)范圍
在這里首先給出當(dāng)索引為0時對應(yīng)的參數(shù)類型為參數(shù)鏈表中第一個元素類型(在這里就是Head)
然后獲取索引位置為i的參數(shù)類型的方法是把參數(shù)鏈表的頭位置向前退一位 這樣就可以在上一步的基礎(chǔ)上繼續(xù)調(diào)用其模板特化形式了

而模板家族TypeAtNonStrict所要做的就是在TypeAt基礎(chǔ)上所作的當(dāng)索引越界時對應(yīng)的參數(shù)類型問題
如下所說:
 1 ////////////////////////////////////////////////////////////////////////////////
 2 // class template TypeAtNonStrict
 3 // Finds the type at a given index in a typelist
 4 // Invocations (TList is a typelist and index is a compile-time integral 
 5 //     constant):
 6 // a) TypeAt<TList, index>::Result
 7 // returns the type in position 'index' in TList, or NullType if index is 
 8 //     out-of-bounds
 9 // b) TypeAt<TList, index, D>::Result
10 // returns the type in position 'index' in TList, or D if index is out-of-bounds
11 ////////////////////////////////////////////////////////////////////////////////
代碼為:
 1         template <class TList, unsigned int index,
 2             typename DefaultType = NullType>
 3         struct TypeAtNonStrict
 4         {
 5             typedef DefaultType Result;
 6         };
 7         
 8         template <class Head, class Tail, typename DefaultType>
 9         struct TypeAtNonStrict<Typelist<Head, Tail>0, DefaultType>
10         {
11             typedef Head Result;
12         };
13         
14         template <class Head, class Tail, unsigned int i, typename DefaultType>
15         struct TypeAtNonStrict<Typelist<Head, Tail>, i, DefaultType>
16         {
17             typedef typename 
18                 TypeAtNonStrict<Tail, i - 1, DefaultType>::Result Result;
19         };

 這里有三個版本分別為獲取越界時的參數(shù)類型
獲取頭參數(shù)類型
第三個是獲取給定位置的參數(shù)類型

接下來的模板類IndexOf的作用是獲取給定類型在類型鏈表中首次出現(xiàn)的位置

1 ////////////////////////////////////////////////////////////////////////////////
2 // class template IndexOf
3 // Finds the index of a type in a typelist
4 // Invocation (TList is a typelist and T is a type):
5 // IndexOf<TList, T>::value
6 // returns the position of T in TList, or NullType if T is not found in TList
7 ////////////////////////////////////////////////////////////////////////////////
具體代碼為:
 1        template <class TList, class T> struct IndexOf;
 2         
 3         template <class T>
 4         struct IndexOf<NullType, T>
 5         {
 6             enum { value = -1 };
 7         };
 8         
 9         template <class T, class Tail>
10         struct IndexOf<Typelist<T, Tail>, T>
11         {
12             enum { value = 0 };
13         };
14         
15         template <class Head, class Tail, class T>
16         struct IndexOf<Typelist<Head, Tail>, T>
17         {
18         private:
19             enum { temp = IndexOf<Tail, T>::value };
20         public:
21             enum { value = (temp == -1 ? -1 : 1 + temp) };
22         };
需要說明的在TypeList這里(也許更多的是在其他地方)
對這種TypeList的操作基本上都是采用的在類型鏈表基礎(chǔ)之上生成新的類型鏈表
這樣就可以保證新的參數(shù)鏈表頭結(jié)點為上次迭代鏈表的第2個節(jié)點這是這類操作的基礎(chǔ)

下面一個是對參數(shù)鏈表的參數(shù)附加
 1 ////////////////////////////////////////////////////////////////////////////////
 2 // class template Append
 3 // Appends a type or a typelist to another
 4 // Invocation (TList is a typelist and T is either a type or a typelist):
 5 // Append<TList, T>::Result
 6 // returns a typelist that is TList followed by T and NullType-terminated
 7 ////////////////////////////////////////////////////////////////////////////////
 8 
 9         template <class TList, class T> struct Append;
10         
11         template <> struct Append<NullType, NullType>
12         {
13             typedef NullType Result;
14         };
15         
16         template <class T> struct Append<NullType, T>
17         {
18             typedef Typelist<T,NullType> Result;
19         };
20 
21         template <class Head, class Tail>
22         struct Append<NullType, Typelist<Head, Tail> >
23         {
24             typedef Typelist<Head, Tail> Result;
25         };
26         
27         template <class Head, class Tail, class T>
28         struct Append<Typelist<Head, Tail>, T>
29         {
30             typedef Typelist<Head, 
31                     typename Append<Tail, T>::Result>
32                 Result;
33         };
在這里可以把一個新的類型或者一個類型鏈表附加到另外一個類型鏈表中去
那么后者的參數(shù)個數(shù)數(shù)相會變?yōu)?者之和
這里的代碼表明如何把一個類型(鏈表)附加到一個NUllType上去
那么結(jié)果就是原有的類型鏈表
1         template <class T> struct Append<NullType, T>
2         {
3             typedef Typelist<T,NullType> Result;
4         };
如果附加前后的類型都為NUllType
則結(jié)果不發(fā)生變化-代碼段為第一個模板
而第三個模板表明其附加的手法是對新加入的類型鏈表中的參數(shù)類型逐個加入的

下面是相關(guān)的測試代碼:
 1 
 2 #include <iostream>
 3 #include <string>
 4 #include <Loki/TypeList.h>
 5 
 6 typedef int Type;
 7 typedef Loki::TL::MakeTypelist<Type,
 8                                char,
 9                                long,
10                                bool,
11                                std::string,
12                                double,
13                                unsigned int,
14                                long long> MyList;
15 class Class{};                               
16 
17 int main()
18 {
19     MyList::Result hlist;
20     std::cout <<"MyList length "<<Loki::TL::Length<MyList::Result>::value<<std::endl; 
21     Loki::TL::TypeAt<MyList::Result,1>::Result result;
22     std::cout<<"the type in indexo of 1: "<<result<<std::endl; 
23     Loki::TL::TypeAtNonStrict<MyList::Result,0>::Result _type; 
24     std::cout<<"default value in index of 0:" <<_type<<std::endl;
25     std::cout<<Loki::TL::IndexOf<MyList::Result,long>::value<<std::endl; 
26     typedef Loki::TL::Append<MyList::Result,Class>::Result NewType;
27     std::cout <<"get length of NewType: "<< Loki::TL::Length<NewType>::value<<std::endl; 
28     
29     system("PAUSE");
30     return EXIT_SUCCESS;
31 }

當(dāng)然Typelist還有其他一些操作比如類型刪除等等
以后再說吧
posted on 2010-04-10 12:25 ccsdu2009 閱讀(1928) 評論(1)  編輯 收藏 引用
Comments
  • # re: Loki技法3-Typelist(1)
    ccsdu2009
    Posted @ 2010-04-10 12:36
    TypeList是Loki工廠等其他幾個模塊的基礎(chǔ)
    雖然這里還沒有看出其實際的用途  回復(fù)  更多評論   

只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲第一精品夜夜躁人人爽| 亚洲综合国产| 亚洲国产精品成人精品| 国产麻豆91精品| 欧美网站在线| 国产精品免费视频观看| 国产精品狼人久久影院观看方式| 欧美精品一区二区久久婷婷| 久久久久青草大香线综合精品| 久久不射中文字幕| 免费一级欧美片在线观看| 欧美激情按摩| 国产亚洲va综合人人澡精品| 亚洲国产1区| 久久av一区| 亚洲韩国日本中文字幕| 一区二区欧美激情| 久久久97精品| 国产精品日韩欧美大师| 亚洲国产日韩美| 亚洲影视九九影院在线观看| 久久人体大胆视频| 一区二区久久久久久| 久久久女女女女999久久| 国产精品成人一区二区三区吃奶 | 99国产精品久久| 亚洲一卡二卡三卡四卡五卡| 久久亚洲欧美国产精品乐播| 欧美精品久久天天躁| 1024日韩| 欧美粗暴jizz性欧美20| 性欧美1819性猛交| 国产精品第一区| 亚洲在线播放| 亚洲午夜黄色| 国产精品视频久久一区| 性欧美1819sex性高清| 亚洲一区二区三区在线视频| 欧美精品亚洲精品| 亚洲另类一区二区| 亚洲国产日韩在线一区模特| 欧美~级网站不卡| 99re亚洲国产精品| 亚洲欧洲一区二区在线观看| 亚洲欧美欧美一区二区三区| 久久久之久亚州精品露出| 欧美国产综合一区二区| 国产精品日韩精品欧美精品| 久久久www成人免费精品| 久久久国产精品一区二区中文| 久久综合给合久久狠狠色 | 老巨人导航500精品| 亚洲欧美另类在线观看| 午夜精品婷婷| 亚洲精品偷拍| 亚洲视频999| 亚洲一区二区在线| 欧美性事免费在线观看| 亚洲在线成人| 亚洲网站视频福利| 亚洲国产婷婷| 欧美在线观看网站| 麻豆成人91精品二区三区| 欧美成人一品| 国产精品综合av一区二区国产馆| 国产一区二区三区四区hd| 国产精品久久久久久久久 | 日韩网站在线| 亚洲黄色在线观看| 久久久国际精品| 黑人一区二区| 亚洲综合色网站| 亚洲精品少妇30p| 免费成人网www| 永久免费精品影视网站| 一区二区三区|亚洲午夜| 美女尤物久久精品| 日韩一区二区精品在线观看| 欧美大片免费观看| 亚洲视频一二三| 亚洲美女中文字幕| 麻豆精品在线播放| 制服丝袜亚洲播放| 午夜日韩在线| 亚洲狠狠婷婷| 日韩网站在线看片你懂的| 国产精品九九久久久久久久| 久久精品理论片| 国产欧美日韩| 禁断一区二区三区在线| 亚洲精品一级| 亚洲一区二区三区视频| 欧美精品v日韩精品v韩国精品v | 亚洲福利专区| 亚洲精选一区二区| 欧美视频网站| 亚洲——在线| 亚洲欧洲一区二区在线观看| 午夜国产精品视频| 最新中文字幕亚洲| 国产精品系列在线播放| 欧美chengren| 美女精品视频一区| 久久成人免费网| 亚洲一区二区三区四区在线观看 | 国产精品欧美一区二区三区奶水| 午夜精品一区二区三区四区| 亚洲日本电影| 亚洲免费成人av| 亚洲第一二三四五区| 蜜臀va亚洲va欧美va天堂| 午夜影院日韩| 亚洲免费婷婷| 欧美亚洲免费电影| 久久精品国产综合| 欧美怡红院视频| 久久激情视频免费观看| 久久爱www| 欧美在线免费一级片| 久久精品国产免费观看| 久久精品一二三区| 蜜桃伊人久久| 狠狠久久综合婷婷不卡| 一区二区视频欧美| 亚洲成人在线免费| 一本色道久久综合狠狠躁篇怎么玩| 亚洲高清色综合| 午夜精品久久久久久久蜜桃app | 欧美三区免费完整视频在线观看| 欧美极品欧美精品欧美视频| 欧美日韩国产一区精品一区| 欧美日韩一区二区三区在线观看免| 欧美激情综合五月色丁香小说| 欧美丝袜一区二区| 国内揄拍国内精品少妇国语| 亚洲三级影院| 久久久久久免费| 亚洲深夜福利视频| 欧美精品激情在线观看| 狠狠色狠狠色综合日日五| 宅男精品视频| 亚洲成人资源网| 久久久人成影片一区二区三区| 欧美亚州一区二区三区| 亚洲国产日韩一区二区| 久久久夜精品| 欧美在线视频日韩| 国产精品久久久久免费a∨大胸 | 国产女主播一区二区三区| 91久久综合亚洲鲁鲁五月天| 久久国产婷婷国产香蕉| 亚洲视频免费在线| 国产精品久久9| 亚洲欧美在线一区二区| 日韩亚洲欧美成人一区| 欧美国产日本| 一区二区三区国产精华| 宅男在线国产精品| 亚洲欧洲在线播放| 久久久久久一区二区| 亚洲视频在线免费观看| 欧美日韩亚洲一区二区三区在线观看| 国产欧美一区二区精品仙草咪| 亚洲日本视频| 亚洲麻豆一区| 国产精品久久久久9999| 亚洲免费婷婷| 欧美中文字幕第一页| 国内一区二区三区在线视频| 久久精品久久综合| 久久久精品日韩欧美| 激情欧美一区二区| 欧美成人性生活| 欧美激情在线免费观看| 亚洲天堂免费观看| 欧美伊人久久久久久午夜久久久久 | 久久av二区| 亚洲黄页一区| 亚洲在线中文字幕| 亚洲日本成人网| 亚洲综合首页| 一本一本久久a久久精品牛牛影视| 亚洲午夜在线观看| 亚洲人成毛片在线播放| 亚洲中无吗在线| 在线亚洲+欧美+日本专区| 久久久水蜜桃| 久久久久免费视频| 国产精品人成在线观看免费 | 99视频热这里只有精品免费| 影音先锋中文字幕一区| 亚洲欧美制服中文字幕| 久久久99爱| 亚洲影院免费| 欧美日韩国产免费观看| 亚洲第一在线视频| a4yy欧美一区二区三区| 欧美gay视频激情| 亚洲国产成人精品女人久久久| 亚洲国产婷婷香蕉久久久久久99|