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

Cpper
C/C++高級工程師 Android高級軟件工程師 IT集成工程師 音頻工程師 熟悉c,c++,java,c#,py,js,asp等多種語言 程序猿
接上文
下面看看TypeList的類型刪除功能
相關源碼為:

////////////////////////////////////////////////////////////////////////////////
// class template Erase
// Erases the first occurence, if any, of a type in a typelist
// Invocation (TList is a typelist and T is a type):
// Erase<TList, T>::Result
// returns a typelist that is TList without the first occurence of T
////////////////////////////////////////////////////////////////////////////////

        template 
<class TList, class T> struct Erase;
        
        template 
<class T>                         // Specialization 1
        struct Erase<NullType, T>
        
{
            typedef NullType Result;
        }
;

        template 
<class T, class Tail>             // Specialization 2
        struct Erase<Typelist<T, Tail>, T>
        
{
            typedef Tail Result;
        }
;

        template 
<class Head, class Tail, class T> // Specialization 3
        struct Erase<Typelist<Head, Tail>, T>
        
{
            typedef Typelist
<Head, 
                    typename Erase
<Tail, T>::Result>
                Result;
        }
;

正如所說
Erase刪除的類型是第一次出現的類型
其特化版本有3個第一個是針對空類型鏈表的刪除
其二和其三的相互迭代構成了對所有位置類型的刪除動作

TypeList的下一個操作是對鏈表的給定類型清空動作
////////////////////////////////////////////////////////////////////////////////
// class template EraseAll
// Erases all first occurences, if any, of a type in a typelist
// Invocation (TList is a typelist and T is a type):
// EraseAll<TList, T>::Result
// returns a typelist that is TList without any occurence of T
////////////////////////////////////////////////////////////////////////////////

        template 
<class TList, class T> struct EraseAll;
        template 
<class T>
        
struct EraseAll<NullType, T>
        {
            typedef NullType Result;
        };
        template 
<class T, class Tail>
        
struct EraseAll<Typelist<T, Tail>, T>
        {
            
// Go all the way down the list removing the type
            typedef typename EraseAll<Tail, T>::Result Result;
        };
        template 
<class Head, class Tail, class T>
        
struct EraseAll<Typelist<Head, Tail>, T>
        {
            
// Go all the way down the list removing the type
            typedef Typelist<Head, 
                    typename EraseAll
<Tail, T>::Result>
                Result;
        };

接著,下面的代碼實現的功能分別是
1.刪除類型鏈表中所有重復的類型
2.類型替換的解決

1.刪除類型鏈表中重復的類型
代碼為:
////////////////////////////////////////////////////////////////////////////////
// class template NoDuplicates
// Removes all duplicate types in a typelist
// Invocation (TList is a typelist):
// NoDuplicates<TList, T>::Result
////////////////////////////////////////////////////////////////////////////////

        template 
<class TList> struct NoDuplicates;
        
        template 
<> struct NoDuplicates<NullType>
        {
            typedef NullType Result;
        };

        template 
<class Head, class Tail>
        
struct NoDuplicates< Typelist<Head, Tail> >
        {
        
private:
            typedef typename NoDuplicates
<Tail>::Result L1;
            typedef typename Erase
<L1, Head>::Result L2;
        
public:
            typedef Typelist
<Head, L2> Result;
        };
如果鏈表為空則不操作
如果鏈表為非空則進行以下動作
刪除位置位置為1,2,3,..的重復類型

下面的功能則是類型替換和鏈表翻轉
////////////////////////////////////////////////////////////////////////////////
// class template Replace
// Replaces the first occurence of a type in a typelist, with another type
// Invocation (TList is a typelist, T, U are types):
// Replace<TList, T, U>::Result
// returns a typelist in which the first occurence of T is replaced with U
////////////////////////////////////////////////////////////////////////////////

        template 
<class TList, class T, class U> struct Replace;
        
        template 
<class T, class U>
        
struct Replace<NullType, T, U>
        {
            typedef NullType Result;
        };

        template 
<class T, class Tail, class U>
        
struct Replace<Typelist<T, Tail>, T, U>
        {
            typedef Typelist
<U, Tail> Result;
        };

        template 
<class Head, class Tail, class T, class U>
        
struct Replace<Typelist<Head, Tail>, T, U>
        {
            typedef Typelist
<Head,
                    typename Replace
<Tail, T, U>::Result>
                Result;
        };

////////////////////////////////////////////////////////////////////////////////
// class template ReplaceAll
// Replaces all occurences of a type in a typelist, with another type
// Invocation (TList is a typelist, T, U are types):
// Replace<TList, T, U>::Result
// returns a typelist in which all occurences of T is replaced with U
////////////////////////////////////////////////////////////////////////////////

        template 
<class TList, class T, class U> struct ReplaceAll;
        
        template 
<class T, class U>
        
struct ReplaceAll<NullType, T, U>
        {
            typedef NullType Result;
        };
        
        template 
<class T, class Tail, class U>
        
struct ReplaceAll<Typelist<T, Tail>, T, U>
        {
            typedef Typelist
<U, typename ReplaceAll<Tail, T, U>::Result> Result;
        };
        
        template 
<class Head, class Tail, class T, class U>
        
struct ReplaceAll<Typelist<Head, Tail>, T, U>
        {
            typedef Typelist
<Head,
                    typename ReplaceAll
<Tail, T, U>::Result>
                Result;
        };

////////////////////////////////////////////////////////////////////////////////
// class template Reverse
// Reverses a typelist
// Invocation (TList is a typelist):
// Reverse<TList>::Result
// returns a typelist that is TList reversed
////////////////////////////////////////////////////////////////////////////////

        template 
<class TList> struct Reverse;
        
        template 
<>
        
struct Reverse<NullType>
        {
            typedef NullType Result;
        };
        
        template 
<class Head, class Tail>
        
struct Reverse< Typelist<Head, Tail> >
        {
            typedef typename Append
<
                typename Reverse
<Tail>::Result, Head>::Result Result;
        };

類型鏈表的最后一個設計的功能是鑒別類型鏈表中有多少個類型繼承于給定類型
////////////////////////////////////////////////////////////////////////////////
// class template MostDerived
// Finds the type in a typelist that is the most derived from a given type
// Invocation (TList is a typelist, T is a type):
// MostDerived<TList, T>::Result
// returns the type in TList that's the most derived from T
////////////////////////////////////////////////////////////////////////////////

        template 
<class TList, class T> struct MostDerived;
        
        template 
<class T>
        
struct MostDerived<NullType, T>
        {
            typedef T Result;
        };
        
        template 
<class Head, class Tail, class T>
        
struct MostDerived<Typelist<Head, Tail>, T>
        {
        
private:
            typedef typename MostDerived
<Tail, T>::Result Candidate;
        
public:
            typedef typename Select
<
                SuperSubclass
<Candidate,Head>::value,
                    Head, Candidate
>::Result Result;
        };

////////////////////////////////////////////////////////////////////////////////
// class template DerivedToFront
// Arranges the types in a typelist so that the most derived types appear first
// Invocation (TList is a typelist):
// DerivedToFront<TList>::Result
// returns the reordered TList 
////////////////////////////////////////////////////////////////////////////////

        template 
<class TList> struct DerivedToFront;
        
        template 
<>
        
struct DerivedToFront<NullType>
        {
            typedef NullType Result;
        };
        
        template 
<class Head, class Tail>
        
struct DerivedToFront< Typelist<Head, Tail> >
        {
        
private:
            typedef typename MostDerived
<Tail, Head>::Result
                TheMostDerived;
            typedef typename Replace
<Tail,
                TheMostDerived, Head
>::Result Temp;
            typedef typename DerivedToFront
<Temp>::Result L;
        
public:
            typedef Typelist
<TheMostDerived, L> Result;
        };
DerivedToFront是排列類型鏈表保持后面的類型繼承于前面的類型
全文測試代碼如下:
#include <iostream>
#include 
<string>
#include 
<Loki/TypeList.h>
#include 
<typeinfo>

typedef 
int Type;
typedef Loki::TL::MakeTypelist
<Type,
                               
char,
                               
long,
                               
bool,
                               
int,
                               std::
string,
                               
double,
                               unsigned 
int,
                               
long long,
                               
int> MyList;
class Class{};
class Class1: public Class{};
class Class2: public Class{};                               
class Class3: public Class{};

int main()
{
    MyList::Result hlist;
    std::cout 
<<"MyList length "<<Loki::TL::Length<MyList::Result>::value<<std::endl; 
    Loki::TL::TypeAt
<MyList::Result,1>::Result result;
    std::cout
<<"the type in indexo of 1: "<<result<<std::endl; 
    Loki::TL::TypeAtNonStrict
<MyList::Result,0>::Result _type; 
    std::cout
<<"default value in index of 0:" <<_type<<std::endl;
    std::cout
<<Loki::TL::IndexOf<MyList::Result,long>::value<<std::endl; 
    typedef Loki::TL::Append
<MyList::Result,Class>::Result NewType;
    std::cout 
<<"get length of NewType: "<< Loki::TL::Length<NewType>::value<<std::endl; 
    typedef Loki::TL::Erase
<MyList::Result,double>::Result NewType2;
    std::cout
<<"new length of NewType:"<<Loki::TL::Length<NewType2>::value<<std::endl; 
    typedef Loki::TL::EraseAll
<MyList::Result,int>::Result NewType3;
    std::cout
<<"new length of NewType after erase all int type:"<<Loki::TL::Length<NewType3>::value<<std::endl; 
    typedef Loki::TL::NoDuplicates
<MyList::Result>::Result NewType4;
    std::cout
<<"new length of New type after NoDuplicates "<<Loki::TL::Length<NewType4>::value<<std::endl;
    typedef Loki::TL::Replace
<MyList::Result,int,Class>::Result NewType5;
    typedef Loki::TL::Append
<MyList::Result,Class1>::Result NewType6;
    typedef Loki::TL::Append
<MyList::Result,Class2>::Result NewType7;
    typedef Loki::TL::Append
<MyList::Result,Class3>::Result NewType8;
    typedef Loki::TL::Append
<MyList::Result,Class2>::Result NewType9;
    typedef Loki::TL::Append
<MyList::Result,long>::Result NewType10;
    
    Loki::TL::MostDerived
<NewType10,int>::Result r;
    std::cout
<<typeid(Loki::TL::MostDerived<NewType10,Class>::Result).name()<<std::endl;
    Loki::TL::DerivedToFront
<NewType10>::Result t; 
    std::cout
<<"new length of New type after Arrange TypeList "<<Loki::TL::Length<NewType10>::value<<std::endl;
    
int len = Loki::TL::Length<NewType10>::value;
    std::cout
<<"the type name in given lindex : "<<typeid(Loki::TL::TypeAtNonStrict<MyList::Result,11>::Result).name()<<std::endl;
    system(
"PAUSE");
    
return EXIT_SUCCESS;
}

Loki TypeList寫完了
感覺到了模板元編程的強大之處
posted on 2010-04-17 10:23 ccsdu2009 閱讀(2019) 評論(4)  編輯 收藏 引用
Comments
  • # re: Loki技法3-Typelist(2)[未登錄]
    tiny
    Posted @ 2010-04-17 19:29
    去看boost的模板元吧。比loki舒服  回復  更多評論   
  • # re: Loki技法3-Typelist(2)
    ccsdu2009
    Posted @ 2010-04-17 19:51
    @tiny
    boost是個龐然大物
    loki比較小

      回復  更多評論   
  • # re: Loki技法3-Typelist(2)
    99書城
    Posted @ 2010-04-18 14:59
    是對方空間是打開解放  回復  更多評論   
  • # re: Loki技法4-Typelist(2)[未登錄]
    無名
    Posted @ 2010-04-22 19:31
    去看看C++0x吧,有更好的方式  回復  更多評論   
 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲在线观看免费| 亚洲字幕一区二区| 欧美日韩成人在线| 噜噜噜躁狠狠躁狠狠精品视频| 欧美怡红院视频| 久久久99久久精品女同性| 久久高清国产| 久久综合国产精品台湾中文娱乐网| 亚洲欧美国产高清va在线播| 校园激情久久| 麻豆91精品91久久久的内涵| 欧美成人高清| 欧美视频日韩| 国产一区在线视频| 亚洲国产毛片完整版| 一个色综合导航| 久久精品国产亚洲一区二区| 老牛国产精品一区的观看方式| 久久亚洲春色中文字幕| 美女免费视频一区| 亚洲精品美女在线| 亚洲视频一区| 久久久久国产一区二区三区四区| 老妇喷水一区二区三区| 欧美视频中文在线看 | 亚洲欧洲一区二区天堂久久| 亚洲人成在线免费观看| 亚洲欧美成人| 久久躁狠狠躁夜夜爽| 亚洲精品综合| 欧美在线一二三四区| 欧美高清hd18日本| 国产一区二区看久久| 夜夜嗨av一区二区三区网页| 久久字幕精品一区| 亚洲免费观看视频| 久久精品一区中文字幕| 欧美午夜a级限制福利片| 精品99一区二区| 亚洲欧美电影在线观看| 欧美激情免费观看| 久久www免费人成看片高清| 欧美日韩在线亚洲一区蜜芽| 亚洲国产精品久久91精品| 欧美一区免费视频| 夜色激情一区二区| 欧美国产成人在线| 亚洲第一久久影院| 久久久综合香蕉尹人综合网| av成人免费观看| 欧美大胆成人| 在线日韩中文| 久久在线视频在线| 久久精品视频在线看| 国产精品一区二区你懂的| 宅男精品导航| 亚洲日韩欧美视频一区| 欧美岛国在线观看| 亚洲国产毛片完整版 | 亚洲麻豆视频| 欧美激情亚洲自拍| 老鸭窝毛片一区二区三区| 精品91免费| 欧美成ee人免费视频| 久久久噜噜噜久久中文字免| 黄色影院成人| 欧美成人tv| 免费成人av在线| 亚洲黄色免费| 亚洲第一精品福利| 欧美激情无毛| 能在线观看的日韩av| 欧美一区二区成人6969| 国产日韩欧美综合| 久久中文字幕一区二区三区| 久久精品一区四区| 91久久综合| 亚洲精品欧洲| 国产精品视频午夜| 久久精品日产第一区二区三区| 欧美一区二区三区成人| 黄色日韩网站| 亚洲国产精品精华液2区45| 欧美日韩精品免费观看视频完整 | 亚洲午夜av| 夜夜爽www精品| 国产精品综合网站| 蜜桃av噜噜一区| 欧美大片在线影院| 亚洲视频axxx| 欧美一区2区三区4区公司二百| 激情国产一区二区| 亚洲欧洲精品一区二区| 国产精品h在线观看| 久久久亚洲成人| 欧美日韩成人在线| 久久精品道一区二区三区| 你懂的视频一区二区| 亚洲一区二区三区在线看| 午夜性色一区二区三区免费视频| 亚洲国产成人一区| 亚洲已满18点击进入久久| 伊人狠狠色j香婷婷综合| 亚洲欧洲精品成人久久奇米网| 国产女人精品视频| 亚洲精品一区二区三区99| 国产在线观看一区| 日韩一级成人av| 亚洲大片在线观看| 亚洲一区久久久| 亚洲精品资源| 久久九九国产精品| 午夜激情综合网| 欧美成人免费va影院高清| 久久精品国产一区二区电影 | 亚洲二区在线观看| 国产日韩亚洲欧美综合| 亚洲精品一区二区三区福利| 国产亚洲制服色| 亚洲黄一区二区| 精品1区2区3区4区| 亚洲欧美中文日韩v在线观看| 亚洲伦伦在线| 欧美18av| 欧美电影在线免费观看网站| 国产精品欧美经典| 99精品国产热久久91蜜凸| 亚洲日本va午夜在线影院| 久久全国免费视频| 久久亚洲国产成人| 国产一区二区成人| 久久婷婷蜜乳一本欲蜜臀| 9人人澡人人爽人人精品| 亚洲第一视频网站| 欧美在线观看你懂的| 羞羞漫画18久久大片| 欧美日韩在线免费视频| 亚洲精品日韩综合观看成人91| 狠狠综合久久av一区二区小说| 亚洲一区激情| 亚洲一区在线视频| 欧美日韩国产a| 亚洲国产欧美久久| 亚洲人成亚洲人成在线观看| 久久精品天堂| 女人香蕉久久**毛片精品| 在线成人亚洲| 麻豆久久婷婷| 亚洲欧洲精品一区二区三区波多野1战4| 在线观看成人av电影| 久久理论片午夜琪琪电影网| 麻豆av一区二区三区| 亚洲国产精品成人综合色在线婷婷| 久久综合狠狠| 亚洲黄色一区| 亚洲一区精品视频| 国产视频在线一区二区| 久久99在线观看| 欧美第一黄色网| 国产精品99久久久久久人| 国产精品免费aⅴ片在线观看| 午夜欧美理论片| 久久久久在线观看| 亚洲精品国产精品乱码不99| 欧美日韩一区视频| 欧美一二三区在线观看| 欧美激情麻豆| 欧美一区二区三区男人的天堂 | 99re66热这里只有精品3直播 | 欧美日韩精品在线视频| 亚洲视频专区在线| 久久天堂国产精品| 99精品国产在热久久| 国产欧美日韩精品一区| 久久伊人免费视频| 中文欧美字幕免费| 欧美 日韩 国产精品免费观看| 中文一区字幕| 在线看视频不卡| 国产精品国产三级国产普通话三级 | 国产精品99久久久久久久女警 | 亚洲在线黄色| 亚洲二区视频| 国产精品免费在线| 欧美成人国产| 欧美一区二区三区在线看| 亚洲欧洲一二三| 久久久亚洲欧洲日产国码αv| 99这里只有久久精品视频| 亚洲福利国产精品| 一区二区三区四区五区精品视频 | 久久久国产精品一区二区三区| 最新日韩在线| 久久综合九色综合欧美狠狠| 日韩一级网站| 亚洲成人在线视频网站| 国产目拍亚洲精品99久久精品| 欧美搞黄网站| 你懂的亚洲视频| 久久伊人亚洲|