- 某些程序除了所处理的数据类型之外,程序代码和程序功能相同,但为了实现他们,却不得不编写多个与具体数据类型紧密结合的程序。例如
cpp
int Min(int a, int b){
return a<b?a:b;
}
float Min(float a, float b){
return a<b?a:b;
}
double Min(double a, double b){
return a<b?a:b;
}
char Min(char a, char b){
return a<b?a:b;
}
- 如何简化以上编程呢?C语言中,可以通过宏的方式实现以上想法:
cpp
#define Min(x,y) ((x)<(y)?(x):(y))
- C++中,也可以利用宏来进行类似程序设计,但宏避开了C++类型检查机制,在某些情况下可能引发错误,是不安全的。更好的方法就是模板来实现这样的程序设计
- C++中的模板与制作冰糕的模具很相似,是生产函数或类的模具。模板接收数据类型参数,并根据此类型创建相应的函数或类
- 对于上面的所有的Min()而已,只需要下面的函数模板就能够生成所有的Min函数
cpp
template <typename T>
T Min(T a, T b){
return a<b?a:b;
}
- template和typename是用来定义模板的关键字。Min模板不涉及任何具体的数据类型,而是用T代表任意数据类型,称为类型参数
- Min模板代表了求两个数值最小值的通用算法,它与具体数据类型无关,但能够生成计算各种具体数据类型的最小值的函数。编译器的做法是用具体的类型替换模板中的类型参数T,生成具体类型的函数Min()。比如用int替换掉模板中所有的T就能生成求两个int类型数据的函数Min()
cpp
#include <iostream>
using namespace std;
#if 0
int Min(int a, int b){
return a<b?a:b;
}
float Min(float a, float b){
return a<b?a:b;
}
double Min(double a, double b){
return a<b?a:b;
}
char Min(char a, char b){
return a<b?a:b;
}
#endif
template <typename T>
T Min(T a, T b){
return a<b?a:b;
}
int main(void){
int m=9, n=3;
double d1=1.8, d2=3.4;
cout << Min(m,n) << endl;
cout << Min(d1, d2) << endl;
return 0;
}
- 从函数模板Min可以看成,C++模板提供了对逻辑结构相同的数据对象通用行为的定义方法,它把通用算法的实现和具体的数据类型区分开来,模板操作的是参数化的数据类型(类型参数)而非实际数据类型。一个带有类型参数的函数称为函数模板,带有类型参数的类称为模板类
- 在调用模板时,必须为它的类型参数提供实际数据类型,C++将用该数据类型替换模板中的全部类型参数,由编译器生成与具体的数据类型相关的可以运行的程序代码,这个过程称为模板的实例化。由函数模板实例化生成的函数称为模板函数 , 由类模板实例化生成的类称为模板类
