模板元中的类型分类技术(type classification)

来源:互联网 发布:java 内部类构造函数 编辑:程序博客网 时间:2024/06/05 19:22

如果模板的参数T是指针,引用或者是数组类型,需要判断T究竟是哪一种。比如是指针类型,需要知道其所指的类型baseT和最终所涉及到的基本类型bottomT,

例如对于int **,baseT的类型是int*, botton的类型是 int。 int *&类型,baseT的类型是int*, bottomT的类型是int。 typedef int* parr[]; baseT的类型是int*, bottom的类型是int。

template <typename T>class Type{public:enum{ IsPtr = 0; IsRef = 0; IsArr = 0 };typedef T baseT;typedef T bottomT;};template <typename T>    //偏特化版本class Type<T*>{public:enum{ IsPtr = 1; IsRef = 0; IsArr = 0 };typedef T baseT;typedef typename Type<T>::bottomT bottomT;  };template <typename T>  //偏特化版本class Type<T&>{public:enum{ IsPtr = 0; IsRef = 1; IsArr = 0 };typedef T baseT;typedef typename Type<T>::bottomT bottomT;};template <typename T, size_t N>   class Type<T[N]>{public:enum{ IsPtr = 0; IsRef = 0; IsArr = 1 };typedef T baseT;typedef typename Type<T>::bottomT bottomT;};

通过枚举量来标记类型,typedef typename Type<T>::bottomT bottomT; 这句丢掉*, &, [];使bottomT采用上一级的bottomT,这句可能会产生递归,比如对于int**  , 则该句为 typedef typename Type<int*>::bottomT bottomT  对于上一级的int * , 则该句为typedef typename Type<int>::bottomT bottomT, 根据非特化版本,bottomT为int类型。

0 0
原创粉丝点击