为什么使用模板?
模板可以解决重载函数定义不全面的问题。
模板的定义:实现代码重用机制的工具,可以实现类型参数化(把类型定义为参数),从而实现真正的代码重用。
模板参数分为两类:函数模板,类模板
(1)函数模板的写法:
Template<class或者也可以用typename T>
返回类型 函数名(形参表)
{//函数体}
说明:template是一个声明模板的关键字,表示声明一个模板关键字class不能省略,如果类型形参多余一个,每个形参前都要加class<类型形参表>可以包含基本数据类型也可以包含类类型。
测试用例:
template<class T>
T min(T x, T y)
{
return (x<y)?x:y;
}
void main()
{
int nx = 2, ny = 10;
float fx = 2.0, fx = 6.7;
cout<<min(nx, ny)<<endl;
cout<<min(fx, fy)<<endl;
}
(2)类模板的写法
定义类模板:
Template<class 或者也可以用typename T>
class类名
{
//类定义...
};
template是声明模板的关键字,声明一个模板,模板参数可以是一个,也可以是多个。
测试用例:
template<typename T1, typename T2>
class myClass
{
private:
T1 name;
T2 sur;
public:
myClass(T1 x,T2 y);
void show();
};
template<typename T1, typename T2>
myClass<T1,T2>::myClass(T1 x,T2 y):name(x),sur(y){}
template<typename T1, typename T2>
void myClass<T1, T2>::show
{
cout<<"name = "<<name<<", sur="<<sur<<endl;
}
void main()
{
myClass<in,int>classx(2,3);
classx.show();
myClass<int,char> classy(3,'a');
classy.show();
}
(3)非类型模板参数
非类型模板参数可以是常整数(包括枚举)或者指向外部链接对象的指针。
则,浮点数是不行的,指向内部链接对象的指针也是不行的
(4)模板的特化
给模板函数(类)的某个特定类型写一个函数,就需要用到模板的特化。
所谓特化,就是代替编译器完成对指定类型的特化工作,现代的模板库中,大量的使用这个技巧。
偏特化,则只针对模板类型中部分类型进行特化。
(5)仿函数
对象和函数指针等都可以被作为参数传递,或作为变量保存。所以可以把一个仿函数传递给一个函数,由这个函数根据需要来调用这个仿函数。
STL模板库大量使用这种技巧,来实现库的灵活。