| template <class T, class U> struct Typelist { typedef T Head; typedef U Tail; }; |
| template <class TList, class T> struct IndexOf; template <class T> struct IndexOf<NullType, T> { enum { value = -1 }; }; template <class T, class Tail> struct IndexOf<Typelist<T, Tail>, T> { enum { value = 0 }; }; template <class Head, class Tail, class T> struct IndexOf<Typelist<Head, Tail>, T> { private: enum { temp = IndexOf<Tail, T>::value }; public: enum { value = (temp == -1 ? -1 : 1 + temp) }; }; |
| // typelistlite.h // 声明Nulltype class NullType; // Typelist的定义 template <class T, class U> struct Typelist { typedef T Head; typedef U Tail; }; // IndexOf的定义 // IndexOf原始模板 template <class TList, class T> struct IndexOf; // 针对NullType的局部特化版 template <class T> struct IndexOf<NullType, T> { enum { value = -1 }; }; // 针对“Tlist头部就是我们要查找的T”的局部特化版 template <class T, class Tail> struct IndexOf<Typelist<T, Tail>, T> { enum { value = 0 }; }; // 处理Tlist尾部的局部特化版 template <class Head, class Tail, class T> struct IndexOf<Typelist<Head, Tail>, T> { private: enum { temp = IndexOf<Tail, T>::value }; public: enum { value = (temp == -1 ? -1 : 1 + temp) }; }; |
| // typelistlite_test.cpp #include <iostream> #include "typelistlite.h" // 自定义类型Royal class Royal {}; // 定义一个包含有char、int、Royal和float的Typelist typedef Typelist<char, Typelist<int, Typelist<Royal, Typelist<float, NullType> > > > CIRF; int main() { std::cout << "IndexOf<CIRF, int>::value = " << IndexOf<CIRF, int>::value << "\n"; std::cout << "IndexOf<CIRF, Royal>::value = " << IndexOf<CIRF, Royal>::value << "\n"; std::cout << "IndexOf<CIRF, double>::value = " << IndexOf<CIRF, double>::value << "\n"; } |
| IndexOf<CIRF, int>::value = 1 IndexOf<CIRF, Royal>::value = 2 IndexOf<CIRF, double>::value = -1 |
关注此文的读者还看过: