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

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>
            欧美va天堂在线| 久久精品72免费观看| 亚洲丰满少妇videoshd| 久久精品一区二区三区中文字幕| 国语自产在线不卡| 噜噜噜久久亚洲精品国产品小说| 久久久久久欧美| 亚洲日本一区二区| 中文精品视频| 精品电影在线观看| 亚洲人成网站在线播| 国产精品国产亚洲精品看不卡15| 性欧美精品高清| 免费国产一区二区| 亚洲欧美日本国产有色| 久久精品国亚洲| 夜夜嗨av一区二区三区四季av| 亚洲欧美日韩天堂| 亚洲国产欧美日韩另类综合| 99亚洲伊人久久精品影院红桃| 国产在线国偷精品产拍免费yy| 你懂的国产精品永久在线| 欧美日韩在线一区| 麻豆精品网站| 国产精品美女| 亚洲国产精品嫩草影院| 国产精品午夜av在线| 欧美国产亚洲精品久久久8v| 国产精品久久久久久久久婷婷| 欧美插天视频在线播放| 国产精品一区二区三区免费观看| 欧美激情无毛| 激情综合在线| 亚洲欧美变态国产另类| 夜夜爽av福利精品导航 | 亚洲一区二区三区在线看| 亚洲欧美在线看| 宅男噜噜噜66一区二区| 美女诱惑黄网站一区| 午夜精品视频在线观看| 欧美—级高清免费播放| 久久亚洲图片| 国产午夜亚洲精品羞羞网站| 99精品欧美一区| 亚洲美女精品久久| 久久一本综合频道| 久久精品人人做人人综合| 国产精品激情| 在线亚洲+欧美+日本专区| 99精品99久久久久久宅男| 欧美本精品男人aⅴ天堂| 久久亚洲精品欧美| 国产一区二区无遮挡| 亚洲午夜日本在线观看| 亚洲影院色无极综合| 欧美日韩国产影片| 99ri日韩精品视频| 中文精品视频一区二区在线观看| 欧美激情一区二区三区在线视频观看 | 国产日韩欧美在线一区| 亚洲永久精品国产| 先锋影音国产精品| 国产女优一区| 先锋亚洲精品| 美女主播一区| 亚洲精华国产欧美| 欧美精品999| 亚洲免费观看| 亚洲欧美日韩国产综合在线| 国产精品色午夜在线观看| 亚洲一区二区精品在线观看| 欧美一区二区大片| 国产永久精品大片wwwapp| 久久国产精品久久国产精品| 男女av一区三区二区色多| 91久久在线观看| 欧美国产日韩在线| 一区二区欧美国产| 欧美中文在线免费| 狠狠狠色丁香婷婷综合久久五月 | 久久男女视频| 亚洲日本理论电影| 亚洲欧美国产精品va在线观看 | 欧美婷婷久久| 欧美一区网站| 欧美大片91| 亚洲一区二区三区在线视频| 国产欧美精品va在线观看| 久久婷婷激情| 中文av一区二区| 久久这里有精品15一区二区三区| 亚洲欧洲在线一区| 国产精品嫩草99av在线| 久久伊伊香蕉| 亚洲私人影院| 欧美bbbxxxxx| 亚洲一区三区视频在线观看| 狠狠色狠狠色综合| 欧美午夜影院| 老司机午夜精品视频在线观看| 99精品国产热久久91蜜凸| 久久aⅴ国产欧美74aaa| 亚洲日本免费| 国产性天天综合网| 欧美色图麻豆| 理论片一区二区在线| 中文欧美在线视频| 亚洲国产一区二区a毛片| 久久成人国产| 亚洲午夜在线观看| 亚洲福利视频网站| 国产视频一区二区在线观看| 欧美精品国产| 久久亚洲国产成人| 欧美一区三区三区高中清蜜桃 | 久久综合国产精品台湾中文娱乐网| 一本色道综合亚洲| 亚洲成色777777在线观看影院| 国产精品久久久久久久久久直播 | 亚洲日本在线观看| 尤物在线观看一区| 国产一区二区你懂的| 国产精品v欧美精品v日本精品动漫 | 欧美视频在线一区| 欧美激情第4页| 久久尤物电影视频在线观看| 亚洲欧美日韩成人高清在线一区| 亚洲欧洲日韩女同| 欧美激情精品久久久久久黑人 | 99这里只有精品| 亚洲欧洲日本mm| 欧美成人四级电影| 老司机精品导航| 久久这里只有| 免费av成人在线| 久久综合一区| 你懂的国产精品永久在线| 卡通动漫国产精品| 免费不卡在线视频| 免费一区二区三区| 欧美福利一区二区| 亚洲第一精品夜夜躁人人爽| 欧美高清视频一区| 亚洲电影免费| 91久久久久久久久| 一区二区激情| 亚洲综合三区| 欧美在线999| 久久精品视频在线免费观看| 久久久久久久综合日本| 欧美va亚洲va香蕉在线| 欧美黄色日本| 国产精品萝li| 狠狠色伊人亚洲综合网站色| 亚洲第一久久影院| 亚洲乱码国产乱码精品精98午夜 | 国内精品嫩模av私拍在线观看| 国产自产2019最新不卡| 亚洲高清电影| 99国产精品国产精品久久| 亚洲午夜视频在线观看| 欧美一区二区三区另类| 麻豆成人在线| 亚洲精品中文字| 亚洲综合成人在线| 久久嫩草精品久久久久| 欧美激情视频在线播放 | 国产午夜精品全部视频在线播放 | 亚洲天堂免费观看| 欧美在线一二三| 欧美激情精品久久久久久蜜臀 | 亚洲在线观看视频| 久久免费偷拍视频| 国产精品二区影院| 黄色av日韩| 亚洲免费中文字幕| 欧美大片91| 午夜精品久久久久久久99水蜜桃 | 亚洲专区国产精品| 免费成人在线视频网站| 国产精品欧美久久| 亚洲日本乱码在线观看| 欧美一区二区三区四区在线观看 | 另类尿喷潮videofree| 亚洲毛片在线看| 久久蜜桃精品| 国产精品女主播一区二区三区| 亚洲高清自拍| 久久成人免费网| 日韩一区二区电影网| 久久久久免费| 国产精品揄拍500视频| 999亚洲国产精| 久久夜色精品一区| 亚洲综合视频1区| 欧美日韩精品欧美日韩精品| 亚洲国产精品一区二区第四页av| 欧美永久精品| 中日韩男男gay无套| 欧美色欧美亚洲另类七区|