之前写了函数模板和类模板,主要就是为了处理多类型的数据
还有几个需要注意的
首先是非类型模板参数
什么是类类型模板参数
就是模板中跟在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;//创建对象