申报网站,货代怎么找客户,项目总结,做休闲会所网站制作非类型模板参数 
定义#xff1a;对于函数模板和类模板#xff0c;模板参数并不局限于类型#xff0c;普通值也可以作为模板参数 
非类型模板参数定义的是常量 
templatetypename T, size_t N
class array;
//T#xff1a;类型模板参数
//N#xff1a;非类型模板参…非类型模板参数 
定义对于函数模板和类模板模板参数并不局限于类型普通值也可以作为模板参数 
非类型模板参数定义的是常量 
templatetypename T, size_t N
class array;
//T类型模板参数
//N非类型模板参数一个常量 
使用场景 
templatetypename T, size_t N
class Stack{
private:T _arr[N];int _top;
};int main(){Stackint,100 st1;Stackfloat,500 st2;return 0;
} 
注意 
非类型模板参数是常量不能修改 
templatetypename T, size_t N
class Stack{
public:void f(){N10; //不可修改非类型模板参数}
private:T _arr[N];int _top;
};int main(){Stackint,100 st1;st1.f();return 0;
} 
有些类型不能作为非类型模板参数例如浮点数、类对象、字符串非类型模板参数基本上都是整型也只有整型是有意义和价值的【char 是整型】非类型模板参数必须在编译期就能确认结果 
array #includeiostream
#includearray
#includevector
using namespace std;
int main() {vectorint v1(100, 0);arrayint, 100 a1;cout  size of v1  sizeof(v1)  endl;cout  size of a1  sizeof(a1)  endl;return 0;
} vector 在堆上开辟空间array 在栈上开辟空间 
用 array 对标 vector 是错误的与原生数组可以对比 
arrayint, 100 a1;
int a2[100]; 
array 的最大优势有一个越界的检查读和写都可以检查到是否越界 
总结array 相较于原生数组有越界检查的优势实际中建议直接使用 vector 
模板特化 
引入给特殊类型准备特殊模板。使用模板可以实现一些与类型无关的代码对于一些特殊类型对其进行一些“特殊的处理” 
定义针对某些类型进行特殊化处理 
函数模板的特化 
步骤 
必须先有一个基础的函数模板关键字 template 后面接一对空的 函数名后跟一对尖括号尖括号中指定需要特化的内容函数形参表必须和模板函数的基础参数类型完全相同 
PS函数模板不一定非要特化写一个匹配参数的普通函数更容易理解 
#includeiostream
#include Date.h
using namespace std;
//函数模板
templatetypename T
bool Less(T left, T right){return left  right;
}
//函数模板的特化处理
template
bool LessDate*(Date* left, Date* right){return *left  *right;
}
//直接匹配的普通函数
bool Less(Date* left, Date* right){return *left  right;   
}
int main(){cout  Less(1, 2)  endl;Date d1(2022, 7, 7);Date d2(2022, 7, 8);cout  Less(d1, d2)  endl;Date* p1  new Date(2022, 7, 16);Date* p2  new Date(2022, 7, 15);cout  Less(p1, p2)  endl;//若存在直接匹配的普通函数函数重载会优先使用现成的函数重载不用实例化return 0;
} 
类模板的特化 
类模板无法实现一个具体的实际类型故必须特化 
#includeiostream
using namespace std;
templatetypename T1, typename T2
//类模板
class Data {
public:Data() {cout  Data T1, T2  endl;}
private:T1 _d1;T2 _d2;
};
//类模板的特化
template
class Dataint, double {
public:Data() {cout  Data int, double  endl;}
};
int main(void) {Dataint, int d1;Dataint, double d2;return 0;
} 
全特化 
定义将模板参数列表中所有的参数都确定化 
#includeiostream
using namespace std;
//类模板
templatetypename T1, typename T2
class Data {
public:Data() {cout  Data T1, T2  endl;}
private:T1 _d1;T2 _d2;
};
//全特化
template
class Dataint, double {
public:Data() {cout  Data int, double  endl;}
};
int main(void) {Dataint, int d1;Dataint, double d2;return 0;
} 
半特化 / 偏特化 
定义将部分参数类表中的一部分参数特化 
#includeiostream
using namespace std;
//类模板
templatetypename T1, typename T2
class Data {
public:Data() {cout  Data T1, T2  endl;}
private:T1 _d1;T2 _d2;
};
//半特化
templatetypename T1
class DataT1, char {
public:Data() {cout  Data T1, char  endl;}
};
//半特化的另一种表现形式可以对参数进行进一步限制
//限制两个参数都是指针只要两个参数都是指针就匹配
templatetypename T1, typename T2
class DataT1*, T2* {
public:Data() {cout  Data T1*, T2*  endl;}
};
//限制两个参数都是引用只要两个参数都是引用就匹配
templatetypename T1, typename T2
class DataT1, T2 {
public:Data() {cout  Data T1, T2  endl;}
};
int main(void) {Dataint, char d3;       // Data T1, charDatachar, char d4;      // Data T1, charDataint*, char* d5;     // Data T1*, T2*Datachar*, string* d6;  // Data T1*, T2*Datachar**, void* d7;   // Data T1*, T2*Dataint, char* d8;      // Data T1, T2Dataint, char d9;     // Data T1, T2Datachar, string d10;  // Data T1, T2Dataint, char d11;      // 编译错误return 0;
}