函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。
格式: template
或template
template <class T>
void Swap(T& a, T& b)
{
T tmp = a;
a = b;
b = tmp;
}
int main()
{
int a = 1, b = 2;
double d1 = 1.2, d2 = 2.1;
Swap(a, b);
Swap(d1, d2);
return 0;
}
在编译阶段,编译器需要根据传入实参的类型推演生成对应类型的函数。
用不同类型的参数使用函数模板时,称为函数模板的实例化。
如上:Swap()
。
template <class T>
T Add(const T x, const T y)
{
return x + y;
}
int main()
{
int a1 = 1;
double d1 = 2.0;
// error
// Add(a1, d1); // 1. Add(a1, (int)d1); 2. 显式实例化
return 0;
}
<>
中指定函数模板的参数类型template <class T>
T Add(const T x, const T y)
{
return x + y;
}
int main()
{
int a1 = 1;
double d1 = 2.0;
Add <double>(a1, d1);// 显式实例化
return 0;
}
template <class T1, class T2, ..., class Tn>
class 类模板名
{
// 类成员定义
};
E.g.
template <class T1>
// typedef int STDateType
class Stack// Stack不是具体的类,是编译器根据被实例化的类型生成的具体类的模具
{
public:
Stack(int capacity = 3)
:_top(0)
, _capacity(capacity)
{
cout << "Stack(int capacity = 3)" << endl;
// _a = new STDateType[capacity];
_a = new T1[capacity];
}
~Stack()
{
cout << "~Stack()" << endl;
delete _a;
_top = _capacity = 0;
}
private:
// STDateType* _a;
T1* _a;
int _top;
int _capacity;
};