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

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>
            国产精品入口夜色视频大尺度| 欧美在线视频播放| 欧美阿v一级看视频| 亚洲人成免费| 99这里只有精品| 国产精品三上| 久久亚洲精品一区二区| 久久午夜影视| 一区二区成人精品| 一区二区三区免费在线观看| 国产精品影片在线观看| 久久久伊人欧美| 欧美激情自拍| 欧美一区二区三区的| 亚洲欧美日韩一区二区三区在线观看 | 亚洲国产美女久久久久| 亚洲第一在线视频| 欧美成人午夜免费视在线看片| 亚洲国产清纯| 中文精品视频一区二区在线观看| 国产老女人精品毛片久久| 老司机免费视频一区二区三区| 久久综合九色综合欧美狠狠| 亚洲精品国产系列| 午夜精品在线看| 亚洲第一福利视频| 亚洲每日更新| 韩国视频理论视频久久| 99这里只有精品| 亚洲国产午夜| 亚洲夜间福利| 亚洲精品护士| 欧美在线你懂的| 一区二区三区精品视频| 久久国产婷婷国产香蕉| 亚洲一区在线直播| 久久男女视频| 亚洲一区二区三区精品在线| 久久亚洲私人国产精品va| 亚洲欧美日韩国产一区| 欧美77777| 久久人人爽国产| 国产日韩欧美三级| 亚洲最新色图| 日韩视频免费在线观看| 久久久夜精品| 久久不见久久见免费视频1| 欧美日韩精品二区| 亚洲高清二区| 亚洲大片免费看| 久久精品在线| 久久久久久午夜| 国产日韩一区在线| 亚洲自啪免费| 亚洲欧美日韩视频二区| 欧美午夜一区二区三区免费大片| 亚洲高清在线| 亚洲精品一区二区三区在线观看| 久久精品国产综合精品| 久久不射网站| 国产日韩欧美91| 午夜精品久久久久久久99黑人| 亚洲一区二区在线免费观看| 欧美日韩国产精品自在自线| 亚洲国产综合91精品麻豆| 亚洲人成网站在线观看播放| 欧美风情在线观看| 亚洲激情影院| 一区二区精品在线观看| 欧美午夜精品久久久久久孕妇| 一区二区三区产品免费精品久久75| aaa亚洲精品一二三区| 欧美高清不卡| 亚洲乱亚洲高清| 一区二区三区日韩精品视频| 欧美日韩在线一区| 在线亚洲国产精品网站| 先锋影音国产一区| 国产欧美一区二区色老头| 新67194成人永久网站| 久久久久九九九九| 1000部精品久久久久久久久| 欧美chengren| 亚洲精品一区二区网址| 亚洲一区二区三区久久| 国产精品视频久久| 久久精品99国产精品| 亚洲成人在线视频网站| 99国产精品视频免费观看| 国产精品久久77777| 亚洲欧美怡红院| 欧美成人69| 一区二区久久| 国产自产v一区二区三区c| 男人的天堂亚洲| 亚洲调教视频在线观看| 久久久精品一区二区三区| 亚洲国产精品久久久久婷婷老年| 欧美精品在线免费播放| 亚洲亚洲精品三区日韩精品在线视频| 久久精品国语| 一区二区三区av| 黄网站免费久久| 欧美精品在线播放| 国产精品视频一区二区三区| 久久久亚洲高清| 日韩视频国产视频| 久久久久久久久久久一区| 亚洲人精品午夜| 国产视频一区免费看| 欧美大片91| 欧美一区中文字幕| 一区二区欧美视频| 欧美成人免费在线| 欧美一区二区免费观在线| 亚洲精选成人| 在线播放亚洲| 国产欧美日韩综合一区在线播放| 噜噜噜躁狠狠躁狠狠精品视频 | 久久资源在线| 午夜日韩激情| 一区二区三区**美女毛片| 亚洲二区在线| 国产一区二三区| 国产精品老牛| 欧美激情网友自拍| 老色鬼精品视频在线观看播放| 亚洲一区精彩视频| 亚洲精品日韩欧美| 欧美成人日韩| 久久综合久久美利坚合众国| 亚洲中午字幕| 亚洲深夜福利视频| 99视频日韩| 亚洲日本中文字幕区| 亚洲国产合集| 1769国内精品视频在线播放| 国产一区二区主播在线| 国产一区二区三区网站| 国产欧美在线| 国产亚洲午夜高清国产拍精品| 国产精品卡一卡二| 欧美性做爰毛片| 国产伦精品一区| 国产欧美精品久久| 国产精品日韩欧美一区| 国产精品久久午夜夜伦鲁鲁| 欧美性大战xxxxx久久久| 欧美午夜一区二区福利视频| 欧美无乱码久久久免费午夜一区 | 麻豆av一区二区三区| 久久在精品线影院精品国产| 久久综合狠狠综合久久综合88| 久久视频精品在线| 欧美电影在线观看完整版| 欧美久久成人| 国产精品sss| 国产区在线观看成人精品| 国内精品久久久久久| 一区一区视频| 日韩一级成人av| 亚洲一区在线免费| 久久噜噜噜精品国产亚洲综合| 欧美中文日韩| 亚洲福利视频网| 99精品99| 欧美在线观看视频在线| 久久综合网色—综合色88| 欧美另类一区| 国产欧美日本一区二区三区| 在线观看三级视频欧美| av72成人在线| 久久精品成人一区二区三区| 欧美高清日韩| 亚洲一区二区三区四区中文| 久久久久看片| 欧美日韩日本国产亚洲在线| 国产一区二区三区不卡在线观看 | 一区二区三区在线免费观看| 亚洲黄色性网站| 亚洲影院高清在线| 欧美国产精品劲爆| 亚洲一区二区三区免费观看| 久久免费偷拍视频| 国产精品久久久久久影院8一贰佰| 国产午夜精品美女视频明星a级| 最近中文字幕mv在线一区二区三区四区| 亚洲视频一起| 欧美大片在线观看| 亚洲欧美日韩一区二区三区在线观看 | 亚洲国产精品精华液网站| 亚洲午夜免费福利视频| 久久视频在线视频| 国产精品综合av一区二区国产馆| 亚洲黄色免费电影| 久久亚洲不卡| 亚洲欧美精品在线| 欧美天天视频| 亚洲精品美女在线观看| 久久久一本精品99久久精品66|