模板是C++支持参数化多态的工具,能够编写与类型无关的代码。
通常有两种形式:函数模板和类模板
(1)函数模板针对参数类型不同的函数;
(2)类模板针对数据成员和成员函数类型不同的类。
注意:模板的声明或定义要在全局、命名空间或类范围内,不能在局部范围或者函数内进行。
一、函数模板
1、定义
函数模板是一个独立于类型的函数,可作为一种方式,产生函数的特定类型版本。
2、格式
- template<class/typename 形参名1,class/typename 形参名2,…> 返回类型 函数名(形参列表)
{
函数体;
}
- template<typename/class T>
返回类型 函数名(形参列表)
{
函数体;
}
注意:模板形参不能为空。声明后可以在该函数中使用模板定义的形参名来定义变量。
3、实例:
template<class T>void swap(T& a,T& b){}
函数的调用方式:swap(1,2);//在调用时会自动判断数据类型
编译器会判断哪个模板实参(template argument)绑定到模板形参(template parameter),一旦编译器确定了实际的模板实参,就称它为实例化(instantiate)了函数模板的一个实例。
二、类模板
1、意义
支持不同类型的对象。
在类和类成员的定义中,可以使用模板形参作为类型或值的占位符,在使用类的时候再提供那些类型或值。
2、格式
template<class/typename 形参名1,class/typename 形参名2,…>class 类名
{
类的声明;
};
注意:模板形参不能为空。声明后可以在该类中使用模板定义的形参名来定义成员变量和成员函数。
在类模板外定义成员函数:
template<模板形参列表[class/typename 形参名1,class/typename 形参名2,…]>函数返回类型 类名<模板形参名>::函数名(函数形参列表)
{
函数体;
}
注意:template后面跟的模板形参应与定义的类的模板形参完全一致
2、实例
template <class T>class A
{
public:
T a;
T b;
T sl(T c,T &d);
};
template<class T1,class T2> void A<T1,T2>::fun(){}
3、类模板对象的创建
类名<形参名1的实例化类型,形参名2的实例化类型,…> 对象名;
例如:A <int> k;