如果模板的参数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类型。