一 函数模板
函数模板,实际上是建立一个通用函数,其返回值类型和形参类型不具体指定,用一个虚拟的类型来代替。这个通用函数就称为函数模板。凡是函数体相同的函数都可以用这个模板来代替,不必定义多个函数,只需在模板中定义一次即可。在调用函数时系统会用实参的类型来取代模板中的虚拟类型,从而实现了不同函数的功能。
定义模板函数的语法为:template <typename 数据类型参数 , typename 数据类型参数 , ...> 返回值类型 函数名(形参列表){
//TODO: //在函数体中可以使用数据类型参数
}
其中,template 是定义模板函数的关键字,template后面的尖括号不能省略;typename 是声明数据类型参数名的关键字,多个数据类型参数以逗号分隔。例如,求两个数的值
//在返回值类型、形参列表、函数体中都可以使用T
template<typename T> T sum(T a, T b){
T temp = a + b;
return temp;
}
template<typename T>为模板头,T为类型参数。模板函数的调用形式和普通函数一样:
int n = sum(10, 20);
float m = sum(12.6, 23.9);
二 类模板
编译器可以根据调用时传递的参数来自动推演数据类型。有时,有两个或多个类,其功能是相同的,仅仅是数据类型不同,如下面语句声明了一个类:
class Compare_int{
public:
Compare(int a,int b){
x=a;
y=b;
}
int max(){
return (x>y)?x:y;
}
int min(){
return (x<y)?x:y;
}
private:
int x,y;
}
显然这基本上是重复性的工作,应该有办法减少重复的工作。C++增加了template功能,提供了解决这类问题。可以声明一个通用的类模板,它可以有一个或多个虚拟的类型参数,如对以上两个类可以综合写出以下的类模板:
template <class numtype>
class Compare{
public:
Compare(numtype a, numtype b){
x=a;
y=b;
}
numtype max(){
return (x>y)?x:y;
}
numtype min(){
return (x<y)?x:y;
}
private:
numtype x,y;
}
可以看到,声明类模板时要增加一行template <class 类型参数名>在上面的例子中numtype就是一个类型参数名。这个名宇是可以任意取的,只要是合法的标识符即可。这里取numtype只是表示“数据类型”的意思而已。此时,mimtype并不是一个已存在的实际类型名,它只是一个虚拟类型参数名。在以后将被一个实际的类型名取代。原有的类型名int换成虚拟类型参数名numtype。在建立类对象时,如果将实际类型指定为int型,编译系统就会用int取代所有的numtype,如果指定为float型,就用float取代所有的numtype。这样就能实现“一类多用”。