模板定义:模板就是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数, 从而实现了真正的代码可重用性。模版可以分为两类,一个是函数模版,另外一个是类模版。
一.函数模板
格式:template <typename 形参名,typename 形参名> 反回类型函数名(参数列表){函数体}
比如:
template <typename T> void swap(T& a, T& b){}
二.类模板
由于类模板包含类型参数,因此又称为参数化的类。如果说类是对象的抽象,
对象是类的实例,则类模板是类的抽象,类是类模板的实例
格式:template<typename 形参名,typename 形参名…> class 类名{}
template<typename T>
class A
{
public:
T a;
T b;
T hy(T c, T &d);
};
A<int> m;//建立实例m
在类模板外部定义成员函数的方法为:
template<模板形参列表> 函数反回类型类名<模板形参名>::函数名(参数列表){函数体},
比如有两个模板形参T1,T2的类A中含有一个void h()函数,则定义该函数的语法为:
template<classT1,class T2> void A<T1,T2>::h(){}。
注意当在类外面定义类的成员时template后面的模板形参应与要定义的类的模板形参一致。
三.非类型模板参数
一般来说,非类型模板参数可以是常整数(包括枚举)或者指向外部链接对象的指针。
那么就是说,浮点数是不行的,指向内部链接对象的指针是不行的。
template<typename T, int MAXSIZE>
class Stack{
Private:
T elems[MAXSIZE];
…
};
Int main()
{
Stack<int, 20> int20Stack;
Stack<int, 40> int40Stack;
…
};
四.将模板类型作为类型参数
template <typename T>
void print(T v)
{
T::iterator itor;
for (itor = v.begin(); itor != v.end(); ++itor)
{
cout << *itor << " ";
}
cout << endl;
}
void main(int argc, char **argv){
list<int> l;
l.push_back(1);
l.push_front(2);
if(!l.empty())
print(l);
vector<int> vec;
vec.push_back(1);
vec.push_back(6);
if(!vec.empty())
print(vec);
}