对于执行功能都相同的函数,只是参数类型和返回值类型不同,那么我们可以利用C++的模板机制只需要写一套代码。模板是实现代码重用机制的一种工具,可以大幅度提高程序设计的效率。模板分为函数模板和类模板。
函数模板
函数模板的声明格式如下:
template <class 类型参数>
返回类型 函数名(模板参数表)
{
函数体
}
注意:在template语句和函数模板定义语句之间不能有其它语句。
例如求最大值的模板如下:
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
template <class T>
T _max(T x,T y)
{
return x > y ? x : y;
}
int main()
{
int a = 1;
int b = 2;
double c = 2.8;
double d = 15.4;
cout<<_max(a,b)<<" "<<_max(c,d)<<endl;
return 0;
}
函数模板中允许使用多个类型参数。例如:
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
template <class T1,class T2>
void Show(T1 x,T2 y)
{
cout<<x<<" "<<y<<endl;
}
int main()
{
Show("Lisa","Luce");
Show(18,"Lisa");
return 0;
}
类模板
一个类模板允许用户为类定义一种模式,使得类中的某些数据成员,某些成员函数的参数或返回值能取任意数据类型。
类模板的声明格式如下:
template <class T>
class 类名
{
//........
};
在类外定义成员函数时,若此成员函数中有类型参数存在,则需要在函数体外进行模板声明,并且在函数名前的类名后缀加上<T>。例如用类模板实现栈代码如下(STL中stack的源代码也差不多是这样):
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
const int N = 10005;
template<class T>
class Stack
{
private:
T S[N];
int size;
public:
void clear()
{
size = 0;
}
void push(T x);
T pop();
bool empty();
};
template<class T>
void Stack<T>::push(T x)
{
if(size == N) return;
S[size++] = x;
}
template<class T>
T Stack<T>::pop()
{
if(size == 0) return NULL;
return S[--size];
}
template<class T>
bool Stack<T>::empty()
{
if(size == 0) return true;
return false;
}
int main()
{
Stack<int> s;
s.clear();
for(int i=1;i<=10;i++)
s.push(i);
while(!s.empty())
cout<<s.pop()<<endl;
return 0;
}