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 */