关于模板的更多的知识点

之前写了函数模板和类模板,主要就是为了处理多类型的数据
还有几个需要注意的
首先是非类型模板参数

什么是类类型模板参数
就是模板中跟在class或者typename之后的参数类型名称
非类型模板参数就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用。
比如

namespace bite {

	template<class T,size_t N> //定义N这个非类型模板参数
	class array{
	public:
		array()
			: _size(0) {
		}
	private:
		T _array[];
		size_t _size;
	};
}
int main() {

	bite::array<int, 10> arr; //直接使用
	return 0;
}

模板的特化
比如

template<class T>

T& Max(T& left, T& right) {

	return left > right ? left : right;
}

找大的数
处理不了char*类型的参数
怎么办 特化

template<>
char*& Max<char*>(char*& left, char*& right) {
	if (strcmp(left, right) > 0) {
		return left;
	}
	return right;

}

这里特化了char*类型,就可以处理了,但是
但是,没啥用,看非特化处理

char* Max(char* left, char* right) {
	if (strcmp(left, right) > 0) {
		return left;
	}
	return right;
}

这是非特化直接处理,直接处理写起来还直观.

接下来是类模板的全特化
全特化即是将模板参数类表中所有的参数都确定化

template<class T1, class T2>
class Data
{
public:
	Data() 
	{ 
		cout << "Data<T1, T2>" << endl; 
	}
private:
	T1 _d1;
	T2 _d2;
};
template<>
class Data<int, char> {
public:
	Data()
	{
		cout << "Data<int, char>" << endl;
	}
private:
	int _d1;
    char _d2;

};
int main() {
	Data<int , char>d1;
	return 0;
}

然后是类木板的偏特化
任何针对模版参数进一步进行条件限制设计的特化版本
首先 来个日期类

template<class T1, class T2>
class Data
{
public:
	Data()
	{
		cout << "Data<T1, T2>" << endl;
	}
private:
	T1 _d1;
	T2 _d2;
};

接下来是部分特化

template<class T1>
class Data<T1,int>
{
public:
	Data()
	{
		cout << "Data<T1, int>" << endl;
	}
private:
	T1 _d1;
	int _d2;
};

然后是对模板参数进一步的条件限制
偏特化并不仅仅是指特化部分参数,而是针对模板参数更进一步的条件限制所设计出来的一个特化版

//两个参数偏特化为指针类型
template <typename T1, typename T2>
class Data <T1*, T2*>
{
public:
 Data() {cout<<"Data<T1*, T2*>" <<endl;}

private:
 T1 _d1;
 T2 _d2;
};
Data<int*, char*> d4;//创建对象
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值