C++语言入门(十一)模板

一.模板可以使函数或者类只写一份代码而对应不同的类型。

  • 函数模板: 

模板声明: 

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();
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值