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

Cpper
C/C++高級工程師 Android高級軟件工程師 IT集成工程師 音頻工程師 熟悉c,c++,java,c#,py,js,asp等多種語言 程序猿
Loki中的TypeList這塊是Loki中比較基礎的部分
其主要涉及類型鏈表(TypeList)
相關功能有
1.模板化得類型鏈表-最打提供18個類型參數
2.獲取類型鏈表的長度
3.獲取給定索引位置的參數類型
4.當索引越界時獲取設定的參數類型
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         };
她的作用是構建一個模板參數不超過18個的類型鏈表
其中NullType是一種PlaceHolder
當定義TypeList的模板參數不超過18個的時候 那么其余參數會被自動設置為NullType
這里提供了一個泛型版本和一個特化版本
當使用MakeTypeList<>的時候就意味著模板參數是NullTYpe

構建除了一個類型鏈表接下來就需要獲取類型鏈表的參數個數
如下所示:
 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 
這里使用了典型的模板元遞歸
首先設置空的類型鏈表長度為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         };

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

而模板家族TypeAtNonStrict所要做的就是在TypeAt基礎上所作的當索引越界時對應的參數類型問題
如下所說:
 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         };

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

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

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的操作基本上都是采用的在類型鏈表基礎之上生成新的類型鏈表
這樣就可以保證新的參數鏈表頭結點為上次迭代鏈表的第2個節點這是這類操作的基礎

下面一個是對參數鏈表的參數附加
 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         };
在這里可以把一個新的類型或者一個類型鏈表附加到另外一個類型鏈表中去
那么后者的參數個數數相會變為2者之和
這里的代碼表明如何把一個類型(鏈表)附加到一個NUllType上去
那么結果就是原有的類型鏈表
1         template <class T> struct Append<NullType, T>
2         {
3             typedef Typelist<T,NullType> Result;
4         };
如果附加前后的類型都為NUllType
則結果不發生變化-代碼段為第一個模板
而第三個模板表明其附加的手法是對新加入的類型鏈表中的參數類型逐個加入的

下面是相關的測試代碼:
 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 }

當然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工廠等其他幾個模塊的基礎
    雖然這里還沒有看出其實際的用途  回復  更多評論   
 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产精品免费视频观看| 亚洲无亚洲人成网站77777| 亚洲免费激情| 日韩亚洲国产精品| 亚洲三级电影全部在线观看高清| 亚洲福利视频网站| 一区二区欧美日韩| 久久久中精品2020中文| 制服诱惑一区二区| 午夜电影亚洲| 久久免费观看视频| 亚洲国产婷婷综合在线精品| 亚洲精品国产精品国自产观看| 亚洲精品在线观看视频| 亚洲欧美另类国产| 男女av一区三区二区色多| 欧美日韩在线视频观看| 国产精品一区免费视频| 亚洲成色最大综合在线| 亚洲一区二区不卡免费| 久久影视精品| 亚洲午夜一区二区| 六月天综合网| 国产精品一区二区久久久| 国内精品久久久久久影视8| 亚洲精品欧美专区| 久久尤物视频| 亚洲天堂av综合网| 欧美va天堂| 国产亚洲激情视频在线| 99精品热视频| 久久久亚洲影院你懂的| 在线亚洲美日韩| 老司机成人网| 国产伦精品一区二区三区在线观看 | 狠狠色综合播放一区二区| 99在线视频精品| 久久亚洲美女| 欧美在线999| 国产精品婷婷午夜在线观看| 一区二区三区高清在线| 欧美高清在线播放| 久久噜噜亚洲综合| 国产日韩成人精品| 亚洲性夜色噜噜噜7777| 亚洲黄色一区| 免费成年人欧美视频| 国产亚洲精品久久飘花| 午夜精品在线看| 99在线|亚洲一区二区| 欧美一级久久久| 亚洲激情啪啪| 欧美精品18| 亚洲九九精品| 欧美国产视频日韩| 久久综合网络一区二区| 狠狠色丁香婷婷综合影院| 欧美中文字幕精品| 亚洲欧美日韩在线播放| 国产欧美一区二区三区在线看蜜臀 | 亚洲精品欧美精品| 老司机免费视频一区二区三区 | 国产精品嫩草99a| 亚洲图色在线| 99国产精品99久久久久久| 欧美伦理91i| 日韩一级片网址| 亚洲乱码国产乱码精品精98午夜| 欧美人与性动交cc0o| 亚洲手机在线| 亚洲欧美日韩精品久久久久| 国产欧美日韩一区二区三区| 久久精品亚洲精品| 久久综合九色综合欧美就去吻| 亚洲国产日韩精品| 99精品国产高清一区二区| 国产精品久久久久久超碰| 久久av老司机精品网站导航 | 国产精品一区视频| 久久国产一区二区三区| 久久久水蜜桃av免费网站| 亚洲精品一区二区三区蜜桃久 | 午夜精品理论片| 尤物九九久久国产精品的特点| 欧美mv日韩mv国产网站| 欧美日韩在线直播| 久久久久久网站| 欧美国产在线视频| 久久久九九九九| 欧美理论电影在线播放| 欧美影院成年免费版| 欧美成人一区二区三区片免费| 午夜精品免费| 欧美护士18xxxxhd| 久久综合九色综合久99| 欧美午夜电影网| 欧美好骚综合网| 国产精品国产三级国产专播精品人| 久久久久亚洲综合| 欧美日韩一区免费| 久久综合久色欧美综合狠狠| 欧美刺激午夜性久久久久久久| 亚洲欧美999| 免费久久99精品国产自| 欧美一区二区三区四区视频| 蜜臀av国产精品久久久久| 欧美在线啊v| 欧美大片专区| 久久婷婷久久一区二区三区| 欧美日韩综合| 亚洲国产精品123| 国产亚洲欧美一区二区三区| 99热精品在线观看| 亚洲精选久久| 玖玖综合伊人| 久久久水蜜桃av免费网站| 国产精品久久久久aaaa九色| 亚洲精品自在久久| 亚洲人成在线影院| 亚洲欧美日韩成人| 亚洲在线观看视频网站| 国产性做久久久久久| 欧美一区二区三区在线播放| 久久综合色8888| 亚洲一区在线看| 99re在线精品| 国产精品美女午夜av| 欧美主播一区二区三区美女 久久精品人 | 亚洲福利视频在线| 国产亚洲精品福利| 亚洲伊人色欲综合网| 一区二区三区精品| 欧美激情按摩| 亚洲黄色尤物视频| 亚洲人成艺术| 欧美精品福利| 一本色道久久精品| 亚洲视频在线一区| 国产精品久久久久久亚洲调教| 亚洲午夜小视频| 欧美在线看片| 狠狠色综合色综合网络| 久久久久久婷| 久久综合中文| 亚洲欧洲精品一区二区精品久久久| 美腿丝袜亚洲色图| 亚洲国产婷婷香蕉久久久久久99| 亚洲日韩第九十九页| 欧美理论电影在线观看| 亚洲一区二区高清视频| 久久精品视频播放| 亚洲黄色在线看| 欧美日韩亚洲一区三区| 亚洲午夜av电影| 久久亚洲综合色一区二区三区| 在线观看成人一级片| 欧美精品激情在线| 亚洲一区在线播放| 噜噜爱69成人精品| 日韩一级成人av| 国产午夜精品久久久久久久| 免费观看成人www动漫视频| 日韩亚洲欧美中文三级| 久久午夜精品一区二区| 亚洲最黄网站| 国产日韩成人精品| 欧美激情视频一区二区三区不卡| avtt综合网| 欧美成人精精品一区二区频| 正在播放欧美视频| 国产字幕视频一区二区| 欧美日韩黄色大片| 久久精品一区二区国产| 99视频一区二区| 欧美成在线视频| 欧美一区二区日韩一区二区| 日韩小视频在线观看| 国产日韩欧美日韩大片| 亚洲精品久久| 亚洲另类视频| 久久久久久网| 亚洲无亚洲人成网站77777| 在线观看亚洲精品| 欧美色一级片| 免费观看在线综合| 久久精品国产第一区二区三区最新章节 | 性色av一区二区三区在线观看| 男女精品视频| 久久精品国产91精品亚洲| 宅男精品视频| 亚洲精品在线免费| 一区三区视频| 国产日韩欧美亚洲一区| 欧美三级网址| 欧美日韩免费观看一区=区三区| 久久久久网站| 久久精视频免费在线久久完整在线看| 一区二区av在线| 亚洲人成在线观看| 欧美激情在线播放|