Typelists(二)

定义部分

Typelists2.h

#include "Typelists.h"
//类型链表的连接
/*****两者都是类型(非TypePair),实际上就是TypePair的构造器:*****/
template<class T, class U>
struct Connect
{
    typedef Typelists_2(T, U) Result;
};
template<class T>
struct Connect<T, NullType>
{
    typedef Typelists_1(T) Result;
};
template<class T>
struct Connect<NullType, T>
{
    typedef Typelists_1(T) Result;
};
template<>
struct Connect<NullType, NullType>
{
    typedef NullType Result;
};
/*****前者是类型,后者是TypePair:*****/
template<class T, class U, class V>
struct Connect<T, TypePair<U, V>>
{
    typedef TypePair<T, TypePair<U, V>> Result;
};
//插入的是空类型
template<class U, class V>
struct Connect<NullType, TypePair<U, V>>
{
    typedef TypePair<U, V> Result;
};
/*****前者是TypePair,后者是类型:*****/
template<class T, class U, class V>
struct Connect<TypePair<T, U>, V>
{
    typedef TypePair<T, typename Connect<U, V>::Result> Result;
};
/*****两者都是TypePair:*****/
template<class T, class U, class V, class W>
struct Connect<TypePair<T, U>, TypePair<V, W>>
{
    typedef TypePair<T, typename Connect<U, TypePair<V, W>>::Result> Result;
};


//在Typelist中删除给定类型(删除第一个遇上的)
template<class TList, class T> struct Erase;
/*****普遍情况*****/
//First就是要删除的类型
template<class T, class U>
struct Erase<TypePair<T, U>, T>
{
    typedef U Result;
};
//First不是要删除的类型
template<class T, class U, class V>
struct Erase<TypePair<T, U>, V>
{
    typedef TypePair<T, typename Erase<U, V>::Result> Result;
};
/*****边界情况*****/
//从空链表中删除类型
template<class T>
struct Erase<NullType, T>
{
    typedef NullType Result;
};


//在Typelist中删除给定类型(删除所有匹配的)
template<class TList, class T> struct EraseAll;
/*****普遍情况*****/
//First就是要删除的类型
template<class T, class U>
struct EraseAll<TypePair<T, U>, T>
{
    typedef typename EraseAll<U, T>::Result Result;
};
//First不是要删除的类型
template<class T, class U, class V>
struct EraseAll<TypePair<T, U>, V>
{
    typedef TypePair<T, typename EraseAll<U, V>::Result> Result;
};
/*****边界情况*****/
//从空链表中删除类型
template<class T>
struct EraseAll<NullType, T>
{
    typedef NullType Result;
};


//在Typelist中删除重复元素
template<class TList> struct Unique;
/*****普遍情况*****/
template<class T, class U>
struct Unique<TypePair<T, U>>
{
    typedef TypePair<T, typename Unique<typename EraseAll<U, T>::Result>::Result> Result;
};
/*****边界情况*****/
//对NullType进行Unique
template<>
struct Unique<NullType>
{
    typedef NullType Result;
};


//以类型A替换链表中类型B(替换第一个)
template<class TList, class Old, class New> struct Replace;
/*****普遍情况*****/
//First就是要被替换的类型
template<class T, class U, class V>
struct Replace<TypePair<T, U>, T, V>
{
    typedef TypePair<V, U> Result;
};
//First不是要被替换的类型
template<class T, class U, class V, class W>
struct Replace<TypePair<T, U>, V, W>
{
    typedef TypePair<T, typename Replace<U, V, W>::Result> Result;
};
/*****边界情况*****/
template<class T, class U>
struct Replace<NullType, T, U>
{
    typedef NullType Result;
};


//以类型A替换链表中类型B(替换所有)
template<class TList, class Old, class New> struct ReplaceAll;
/*****普遍情况*****/
//First就是要被替换的类型
template<class T, class U, class V>
struct ReplaceAll<TypePair<T, U>, T, V>
{
    typedef TypePair<V, typename ReplaceAll<U, T, V>::Result> Result;
};
//First不是要被替换的类型
template<class T, class U, class V, class W>
struct ReplaceAll<TypePair<T, U>, V, W>
{
    typedef TypePair<T, typename ReplaceAll<U, V, W>::Result> Result;
};
/*****边界情况*****/
template<class T, class U>
struct ReplaceAll<NullType, T, U>
{
    typedef NullType Result;
};

测试部分

Typelists2.cpp

#include <iostream>
using namespace std;
#include "Typelists2.h"
int main()
{
    typedef Typelists_1(int) TLInt;
    typedef Typelists_2(char, double) TLCharDouble;
    typedef Connect<TLInt, TLCharDouble>::Result Result0;
    typedef Connect<long, Result0>::Result Result1;
    typedef Connect<Result1, unsigned int>::Result Result2;
    typedef Connect<Result2, Result0>::Result Result3;

    cout << typeid(TypeAt<Result3, 0>::Result).name() <<endl;
    cout << typeid(TypeAt<Result3, 1>::Result).name() <<endl;
    cout << typeid(TypeAt<Result3, 2>::Result).name() <<endl;
    cout << typeid(TypeAt<Result3, 3>::Result).name() <<endl;
    cout << typeid(TypeAt<Result3, 4>::Result).name() <<endl;
    cout << typeid(TypeAt<Result3, 5>::Result).name() <<endl;
    cout << typeid(TypeAt<Result3, 6>::Result).name() <<endl;
    cout << typeid(TypeAt<Result3, 7>::Result).name() <<endl << endl;

    typedef Erase<Result3, char>::Result Result4;
    cout << typeid(TypeAt<Result4, 0>::Result).name() <<endl;
    cout << typeid(TypeAt<Result4, 1>::Result).name() <<endl;
    cout << typeid(TypeAt<Result4, 2>::Result).name() <<endl;
    cout << typeid(TypeAt<Result4, 3>::Result).name() <<endl;
    cout << typeid(TypeAt<Result4, 4>::Result).name() <<endl;
    cout << typeid(TypeAt<Result4, 5>::Result).name() <<endl;
    cout << typeid(TypeAt<Result4, 6>::Result).name() <<endl << endl;
    typedef Erase<Erase<Result4, double>::Result, double>::Result Result5;
    cout << typeid(TypeAt<Result5, 0>::Result).name() <<endl;
    cout << typeid(TypeAt<Result5, 1>::Result).name() <<endl;
    cout << typeid(TypeAt<Result5, 2>::Result).name() <<endl;
    cout << typeid(TypeAt<Result5, 3>::Result).name() <<endl;
    cout << typeid(TypeAt<Result5, 4>::Result).name() <<endl << endl;

    typedef EraseAll<Result3, char>::Result Result6;
    cout << typeid(TypeAt<Result6, 0>::Result).name() <<endl;
    cout << typeid(TypeAt<Result6, 1>::Result).name() <<endl;
    cout << typeid(TypeAt<Result6, 2>::Result).name() <<endl;
    cout << typeid(TypeAt<Result6, 3>::Result).name() <<endl;
    cout << typeid(TypeAt<Result6, 4>::Result).name() <<endl;
    cout << typeid(TypeAt<Result6, 5>::Result).name() <<endl << endl;

    typedef Unique<Result3>::Result Result7;
    cout << typeid(TypeAt<Result7, 0>::Result).name() <<endl;
    cout << typeid(TypeAt<Result7, 1>::Result).name() <<endl;
    cout << typeid(TypeAt<Result7, 2>::Result).name() <<endl;
    cout << typeid(TypeAt<Result7, 3>::Result).name() <<endl;
    cout << typeid(TypeAt<Result7, 4>::Result).name() <<endl << endl;

    typedef Replace<Result3, int, char>::Result Result8;
    cout << typeid(TypeAt<Result8, 0>::Result).name() <<endl;
    cout << typeid(TypeAt<Result8, 1>::Result).name() <<endl;
    cout << typeid(TypeAt<Result8, 2>::Result).name() <<endl;
    cout << typeid(TypeAt<Result8, 3>::Result).name() <<endl;
    cout << typeid(TypeAt<Result8, 4>::Result).name() <<endl;
    cout << typeid(TypeAt<Result8, 5>::Result).name() <<endl;
    cout << typeid(TypeAt<Result8, 6>::Result).name() <<endl;
    cout << typeid(TypeAt<Result8, 7>::Result).name() <<endl << endl;

    typedef ReplaceAll<Result3, int, char>::Result Result9;
    cout << typeid(TypeAt<Result9, 0>::Result).name() <<endl;
    cout << typeid(TypeAt<Result9, 1>::Result).name() <<endl;
    cout << typeid(TypeAt<Result9, 2>::Result).name() <<endl;
    cout << typeid(TypeAt<Result9, 3>::Result).name() <<endl;
    cout << typeid(TypeAt<Result9, 4>::Result).name() <<endl;
    cout << typeid(TypeAt<Result9, 5>::Result).name() <<endl;
    cout << typeid(TypeAt<Result9, 6>::Result).name() <<endl;
    cout << typeid(TypeAt<Result9, 7>::Result).name() <<endl << endl;
}
/*
long
int
char
double
unsigned int
int
char
double

long
int
double
unsigned int
int
char
double

long
int
unsigned int
int
char

long
int
double
unsigned int
int
double

long
int
char
double
unsigned int

long
char
char
double
unsigned int
int
char
double

long
char
char
double
unsigned int
char
char
double
*/

posted on 2011-03-22 13:44  Observer  阅读(239)  评论(0编辑  收藏  举报

导航