一.模板可以使函数或者类只写一份代码而对应不同的类型。
- 函数模板:
模板声明:
template <模板形参表> 函数返回类型 函数(形参表);
模板定义:
template <模板形参表>
函数返回类型 函数(形参表){
函数体;
};
例如:
#include <iostream>
using namespace std;
template<typename T> // T 为类型名
T Max(T a,T b){ //函数模板
return a>b?a:b;
}
int main () {
string n,m;
cin >> n >> m;
cout << Max(n,m) << endl; // 当参数为同一类型 用string替换 T
long a = 10;
int b = 20;
cout << Max<long>(a,b) << endl; //参数为不同类型 加个<long>强制用long型
}
- 类模板
模板声明
template <模板形参表> class 类名;
模板定义
template <模板形参表>
class 类名 {
}
例如:
#include<iostream>
using namespace std;
template<typename T>
class Point{
T x,y;
public:
Point(T x,T y):x(x),y(y){}
template<typename U>
friend ostream& operator<<(ostream& os,const Point<U>& p);
};
template<typename U>
ostream& operator<<(ostream& os,const Point<U>& p){
os << "(" << p.x << "," << p.y << ")";
return os;
}
int main(){
Point<int> p(1,2);//必须加上指定类型
cout << p << endl;
}
二.特化
把一些具体类型特殊化处理
- 函数模板特化
特点:函数模板,却只有全特化,不能偏特化。
- 类模板特化
- 全特化:具体指定模板的全部模板参数的类型。
- 局部特化:具体指定模板的部分模板参数的类型。
#include<iostream>
#include<cstring>
using namespace std;
template<typename T>
T Max(T a,T b){
return a>b?a:b;
}
//指定具体类型
template<>
const char* Max(const char* a,const char* b){
return strcmp(a,b) >0?a:b;
}
//改变传入的类型
template<typename T>
T Max(T* a,T* b){
return *a>*b?*a:*b;//原来为传值,现在为传指针
}
//改变参数个数
template<typename T>
T Max(T a,T b,T c){
T t = a>b?a:b;
return t>c?t:c;
}
int main(){
const char* a = "xyz";
const char* b = "abc";
cout << Max(a,b) << endl; //这样只会使地址进行比较,所以进行特化
//使所有char*类型都调用特化
int n = 10;
int m = 5;
int* p = &n;
int* q = &m;
cout << Max(p,q) << endl;
cout << Max(4,9,2) << endl;
}
数组形式:
#include<iostream>
using namespace std;
//模板函数
template<typename T,size_t N>
T Min(T* arr){ //数组都是以指针形式传入
T res = arr[0];
for(int i=1;i<N;++i){
if(res > arr[i]){
res = arr[i];
}
}
return res;
}
template<typename T,size_t N>
T Min2(T (&arr)[N]){ //当不指定类型和大小时
T res = arr[0];
for(int i=1;i<N;++i){
if(res > arr[i]){
res = arr[i];
}
}
return res;
}
//类模板
template<typename T,size_t N>
class Point{
T arr[N];
public:
Point(T (&arr)[N]){
for(int i=0;i<N;++i){
this->arr[i] = arr[i];
}
}
void Print()const{
cout << "(";
for(int i=0;i<N;++i){
cout << arr[i];
if(i!=N-1) cout << ",";
}
cout << ")" << endl;
}
};
int main(){
int arr[] = {2,5,7,8,3,6,1};
cout << Min<int,7>(arr) << endl;
cout << Min2(arr) << endl; //函数模板可以不用指定类型和大小
Point<int,7> p7D(arr); //类模板必须指定
p7D.Print();
}