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

本文探讨了如何通过枚举量标记并区分模板参数T为指针、引用或数组类型,以及如何实现针对特定类型的偏特化版本。通过实例展示了不同类型参数的底级类型识别过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值