c++ 泛型程式設計 之 TypeLists
完整程式碼 在
http://download.csdn.net/detail/zhuyingqingfen/8457091
關於 C++ 泛型中的 TypeTraits ,參考 c++ 泛型程式設計 之 TypeTraits
#ifndef TYPE_LISTS_H_
#define TYPE_LISTS_H_
#include <iostream>
#include <string>
#include "typetraits.h"
/*
TypeLists 內部沒有任何數值(value),他們的實體是空的,不含有任何狀態,也未定義任何函式。
執行期間TypeLists也不帶任何數值,他們存在的理由只是為了攜帶型別資訊。TypeLists 並未打算被具
現化。因此,當我們說“a TypeListL”,實際指的是一個typelist型別,不是一個typelist 物件。
規定 typelist 必須以NullType(類)結尾,NullType可被視為一個結束符號,類似於c字串的\0功能,
定義一個只有一個元素的typelist如下:
typedef Typelist<int,NullType> OneTypeOnly.
*/
template<class T,class U>
struct Typelist
{
typedef T Head;
typedef U Tail;
};
//通過定義巨集 將typelist線性化
#define TYPELIST_0() NullType
#define TYPELIST_1(T1) Typelist<T1,TYPELIST_0()>
#define TYPELIST_2(T1,T2) Typelist<T1,TYPELIST_1(T2)>
#define TYPELIST_3(T1,T2,T3) Typelist<T1,TYPELIST_2(T2,T3)>
#define TYPELIST_4(T1,T2,T3,T4) Typelist<T1,TYPELIST_3(T2,T3,T4)>
#define TYPELIST_5(T1,T2,T3,T4,T5) Typelist<T1,TYPELIST_4(T2,T3,T4,T5)>
//計算TypeList長度
//大多數Typelist的操作都是基於遞迴,遞迴終止條件通過模板特化實現。
template<class TList>struct Length;
template<>struct Length<NullType>//Length的全特化,即,只匹配NullType。
{
enum{value = 0};
};
template<class T,class U>
struct Length<Typelist<T,U> >//Length的扁特化,可匹配任何TypeList<T,U>型別,包括U同時也是Typelist的複合情況。
{
enum{value = 1+Length<U>::value};
};
//2 索引式訪問
template <class TList,unsigned int index> struct TypeAt;
template<class Head,class Tail>
struct TypeAt<Typelist<Head,Tail>,0>
{
typedef Head Result;
};
template<class Head,class Tail,unsigned int i>
struct TypeAt<Typelist<Head,Tail> ,i>
{
typedef typename TypeAt<Tail,i-1>::Result Result;
};
//類似TypeAt功能,不過TypeAtNonStrict對逾界訪問更加寬容。
//比如TypeList的個數是3,那麼你不能使用TypeAt<TL3,3>::Result,這樣會編譯錯誤。
//但是TypeAtNonStrict<TL3,3,NullType>::Result可以,如果不存在索引為3的type,那麼結果是第三個引數即NullType
template <class TList, unsigned int i, typename DefType = NullType>
struct TypeAtNonStrict
{
typedef DefType Result;
};
template <class T, class U, typename DefType>
struct TypeAtNonStrict< Typelist<T, U>, 0, DefType >
{
typedef T Result;
};
template <class T, class U, unsigned int i, typename DefType>
struct TypeAtNonStrict< Typelist<T, U>, i, DefType >
{
typedef typename TypeAtNonStrict<U, i - 1, DefType>::Result Result;
};
//3 查詢TypeList
template<class TList,class T> struct IndexOf;//宣告
template<class T>
struct IndexOf<NullType,T>//如果TList為NullType,那麼令value = -1;
{
enum{value = -1};
};
template<class Tail,class T>
struct IndexOf<Typelist<T,Tail> ,T>//如果T是TList中的頭端,那麼令value= 0;
{
enum{value = 0};
};
template<class Head,class Tail,class T>//將IndexOf施於TList尾端和T,並將結果置於一個臨時變數temp
struct IndexOf<Typelist<Head,Tail> ,T>//如果temp為-1,令value為-1,否則令value為1+temp
{
private:
enum{temp = IndexOf<Tail,T>::value};//temp要先於value宣告定義。
public:
enum{value = temp == -1 ? -1 : temp + 1};
};
//4 附加元素到typelist
template <class Tlist,class T>struct Append;//宣告
template<>struct Append<NullType,NullType>//如果TList是NULL而且T是NULL,那麼令Result為NullType
{
typedef NullType Result;
};
template <class T> struct Append<NullType,T> //如果TList是NullType,且T是type(非typelist),
{ //那麼Result將是"只含有唯一元素的T";
typedef TYPELIST_1(T) Result;
};
template <class Head,class Tail>
struct Append<NullType,Typelist<Head,Tail> >// 如果TList是NullType,且T是一個typelist,那麼Result便是T本身
{
typedef Typelist<Head,Tail> Result;
};
template<class Head,class Tail,class T>//否則,如果Tlist是non-null,那麼result將是個typelist,以TList::Head
struct Append<Typelist<Head,Tail>,T> //為起頭端,並以T附加到TList::Tail的結果為其尾端。
{
typedef Typelist<Head,typename Append<Tail,T>::Result> Result;
};
//5 Reverse
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;
};
#endif
測試
void typelists_test()
{
typedef TYPELIST_0() TL0;
typedef TYPELIST_3(char,int,double) TL3;
typedef TYPELIST_3(char,int,double) TL3_1;
//Length
std::cout<<Length<TL0>::value<<std::endl;
std::cout<<Length<TL3>::value<<std::endl;
//TypeAt
typedef TypeAt<TL3,0>::Result Parm1;
typedef TypeAt<TL3,1>::Result Parm2;
typedef TypeAt<TL3,2>::Result Parm3;
typedef TypeAtNonStrict<TL3,3,EmptyType>::Result TEST_TYPE;
std::cout<<"Parm1 Type:"<<typeid(Parm1).name() <<" sizeof : "<< sizeof(Parm1)<<std::endl;
std::cout<<"Parm2 Type:"<<typeid(Parm2).name() <<" sizeof : "<< sizeof(Parm2)<<std::endl;
std::cout<<"Parm3 Type:"<<typeid(Parm3).name() <<" sizeof : "<< sizeof(Parm3)<<std::endl;
std::cout<<"TEST_TYPE Type:"<<typeid(TEST_TYPE).name() <<" sizeof : "<< sizeof(TEST_TYPE)<<std::endl;
//IndexOf
std::cout<<"char indexof TL3 :"<<IndexOf<TL3,char>::value<<std::endl;
std::cout<<"int indexof TL3 :"<<IndexOf<TL3,int>::value<<std::endl;
std::cout<<"float indexof TL3 :"<<IndexOf<TL3,float>::value<<std::endl;
//Append
typedef Append<TL3,int> TL4;//TL4不是一個TypeList
typedef Append<TL3_1,TYPELIST_2(float,double)> TL5;
std::cout<<"TL4 Length :"<<Length<TL4::Result>::value<<std::endl;
std::cout<<"TL5 Length :"<<Length<TL5::Result>::value<<std::endl;
//Reverse
std::cout<<"Reverse result:"<<typeid(Reverse<TL3>::Result).name()<<std::endl;
}
相關文章
- c++ 泛型 程式設計 之 Functor 設計模式C++泛型程式設計設計模式
- c++ 泛型程式設計 之 自動生成程式碼C++泛型程式設計
- C++ primer 模板與泛型程式設計C++泛型程式設計
- 泛型程式設計泛型程式設計
- C++ 泛型程式設計基礎:模板通識C++泛型程式設計
- java 泛型程式設計Java泛型程式設計
- 泛型程式設計在非C++語言中的實現之探討 (轉)泛型程式設計C++
- 十、GO程式設計模式 : 泛型程式設計Go程式設計設計模式泛型
- c++ 泛型 之 TypeTraintsC++泛型AI
- 02. 程式設計核心內功心法之泛型程式設計泛型
- 泛型程式設計詳解(一)泛型程式設計
- 泛型程式設計與 OI——modint泛型程式設計
- C++ STL與泛型程式設計-第一篇 (Boolan)C++泛型程式設計
- C++ 簡單實現陣列類泛型程式設計示例C++陣列泛型程式設計
- 物件導向程式設計和`GP`泛型程式設計物件程式設計泛型
- .NET泛型程式設計簡介 (轉)泛型程式設計
- 【C++ 泛型程式設計01:模板】函式模板與類别範本C++泛型程式設計函式
- 泛型最佳實踐:Go泛型設計者教你如何用泛型泛型Go
- GO語言泛型程式設計實踐Go泛型程式設計
- 好程式設計師Java教程分享Java難點解析之泛型程式設計師Java泛型
- java泛型之泛型方法。Java泛型
- 在C語言中實現泛型程式設計C語言泛型程式設計
- C語言如何實現泛型程式設計?C語言泛型程式設計
- Swift使用協議加泛型程式設計(一)Swift協議泛型程式設計
- Go 泛型之泛型約束Go泛型
- java泛型之泛型陣列。Java泛型陣列
- C++泛型一:模板C++泛型
- Rust 程式設計影片教程(進階)——001 泛型Rust程式設計泛型
- 使用 Go 泛型的函數語言程式設計Go泛型函數程式設計
- [.net 物件導向程式設計基礎] (18) 泛型物件程式設計泛型
- QML之C++混合程式設計C++程式設計
- 談談 "JS 和 設計泛型"JS泛型
- 好程式設計師大資料學習路線分享Scala系列之泛型程式設計師大資料泛型
- 好程式設計師Java培訓之泛型繼承原理與用法詳解程式設計師Java泛型繼承
- C++泛型演算法C++泛型演算法
- Rust 程式設計視訊教程(進階)——001 泛型Rust程式設計泛型
- java筆記-two-java泛型程式設計(簡記)Java筆記泛型程式設計
- [CUJ]泛型程式設計--轉移建構函式 (轉)泛型程式設計函式