[C++模板技术] TypeList(2)

来源:互联网 发布:ubuntu卸载搜狗输入法 编辑:程序博客网 时间:2024/05/21 05:41

基于上一篇,这里接着给出针对TypeList的系列操作。就如同求一个TypeList的长度一样,我们依旧需要利用大量的递归技术。

1、随机访问

template <typename TList,unsigned int index>struct TypeAt;template <typename Head,typename Tail>struct TypeAt<TypeList<Head,Tail>,0>{using Result = Head;};template <typename Head,typename Tail,unsigned int index>struct TypeAt<TypeList<Head, Tail>, index>{using Result = typename TypeAt<Tail, index - 1>::Result;};

2、类别索引查找

template <typename TList,typename T>struct IndexOf;template<typename T>struct IndexOf<NullType, T>{enum{value = -1;};};template<typename T, typename Tail>struct IndexOf<TypeList<T, Tail>, T>{enum{value = 0};};template <typename Head,typename Tail,typename T>struct IndexOf<TypeList<Head, Tail>, T>{private:enum{temp = IndexOf<Tail, T>::value};public:enum{value = temp == -1 ? -1 : temp + 1};};

3、附加元素

template<typename TList,typename T>struct Append;template<>struct Append<NullType, NullType>{using Result = NullType;};template<typename T>struct Append<NullType, T>{using Result = TypeList<T, NullType>;};template<typename Head,typename Tail>struct Append<NullType, TypeList<Head, Tail>>{using Result = TypeList<Head, Tail>;};template<typename Head,typename Tail,typename T>struct Append<TypeList<Head, Tail>, T>{using Result = TypeList<Head, typename Append<Tail, T>::Result>;};

4、删除特定类型

template<typename TList,typename T>struct Erase;template<typename T>struct Erase<NullType, T>{using Result = NullType;};template<typename Tail,typename T>struct Erase<TypeList<T, Tail>, T>{using Result = Tail;};template<typename Head,typename Tail,typename T>struct Erase<TypeList<Head, Tail>, T>{using Result = TypeList<Head, typename Erase<Tail, T>::Result>;};