函数模板可以用来创建一个通用功能的函数,以支持多种不同形参,进一步简化重载函数的函数体设计。
声明方法: template <typename 标识符> 函数声明
例:求绝对值的函数模板
#include<iostream>
using namespace std;
template<typename T>
T abs(T x)
{ return x<0?-x:x; }
int main()
{ int n=-5;
double d=-5.5;
cout<<abs(n)<<endl;
cout<<abs(d)<<endl;
}
使用类模板使用户可以为类声明一种模式,使得类中的某些数据成员、某些成员函数的参数、某些成员函数的返回值,能取任意类型(包括基本类型的和用户自定义类型)
类模板的声明
template <模板参数表> class 类名 {类成员声明}
如果需要在类模板以外定义其成员函数,则要采用以下的形式:
template <模板参数表> 类型名 类名<T>::函数名(参数表)
例:
#include <iostream>
#include <cstdlib>
using namespace std;
// 结构体Student
struct Student
{
int id; //学号
float gpa; //平均分
};
template <class T>
//类模板:实现对任意类型数据进行存取
class Store
{ private:
T item; //用于存放任意类型的数据
int haveValue;//用于标记item是否已被存入内容
public:
Store(void); //默认形式(无形参)的构造函数
GetElem(void); //提取数据函数
void PutElem(T x);//存入数据函数
};
// 默认形式构造函数的实现
template <class T>
Store<T>::Store(void): haveValue(0) {}
template <class T> // 提取数据函数的实现
T Store<T>::GetElem(void)
{ // 如果试图提取未初始化的数据,则终止程序
if (haveValue == 0)
{ cout << "No item present!" << endl;
exit(1);
}
return item; // 返回item中存放的数据
}
template <class T> // 存入数据函数的实现
void Store<T>::PutElem(T x)
{ // 将haveValue 置为 TRUE,表示item中已存入数值
haveValue++;
item = x; // 将x值存入item
}
int main()
{ Student g= {1000, 23};
Store<int> S1, S2;
Store<Student> S3;
Store<double> D;
S1.PutElem(3);
S2.PutElem(-7);
cout << S1.GetElem() << " "
<<S2.GetElem()<<endl;
S3.PutElem(g);
cout << "The student id is "
<<S3.GetElem().id<<endl;
cout << "Retrieving object D " ;
cout << D.GetElem() << endl; //输出对象D的数据成员
// 由于D未经初始化,在执行函数D.GetElement()时出错
}