第八章、模板
1.1、函数模板
一、定义
template<class 类型名1,class 类型名2,…>
返回类型 函数名(形参表){
函数体;
}
【例】
用一个函数表示逻辑功能相同但参数类型不同的函数
#include <iostream>
using namespace std;
template<class T>
void Swap(T & x, T & y){
T tmp = x;
x = y;
y = tmp;
}
int main(){
int n = 1, m = 2;
Swap(n, m); //编译器自动生成 void Swap (int &, int &)函数
double f = 1.2, g = 2.3;
Swap(f, g); //编译器自动生成 void Swap (double &, double &)函数
return 0;
}
二、模板合法写法
#include <iostream>
using namespace std;
template <class T>
T Inc(int n){
return 1 + n;
}
int main(){
cout << Inc<double>(4) / 2;
return 0;
}
Inc(4)指明了此处实例化的模板函数原型应为:double Inc(double);
编译器不会因为实参 4 是 int 类型,就生成原型为 int Inc(int) 的函数。因此,上面程序输出的结果是 2.5 而非 2。
函数模板中可以有不止一个类型参数。例如,下面这个函数模板的写法是合法的:
template <class Tl, class T2>
T2 print(T1 argl, T2 arg2)
{
cout << arg1 << " " << arg2 << endl;
return arg2;
}
1.2、类模板
一、定义
(1)template <class 参数化类型1,class 参数化类型2,……,普通类型1,普通类型2,……>
class 类模板名{
成员函数和成员变量
};
利用类模板可以建立支持各种数据类型的类。
例子:
template<class T>
class Point{
public:
Point():x(0),y(0){}
Point(const T a,const T b);
void Set(const T a,const T b);
void Display(){
cout<<"Display:"<<"x="<<x<<",y="<<y<<endl;
}
private:
T x,y;
};
(2)如果在类模板外部定义成员函数,形式为:
template<模板形参表>
返回类型 类名<类型参数表>::函数名(形式参数列表){
函数体
};
例如:
template<class T>
void Point<T>::Set(const T a,const T b){
x=a,y=b;
};
(3)用类模板定义对象时,必须为模板形式参数显式指定类型实参,将类模板实例化,一般形式为:
类模板名<类型实参表>对象名列表;
例如:
Point<int >a,b;
Point<double>m(1,2),n(3,4);
(4)模板形参表可以是非类型形参,其形式与函数形参表相似:
template<class T ,int N>
class Se{
...
};
template<class T,int N>
void Se<T,N>::Set(int i, T value)
{...}
二、优点