首页 > 代码库 > c++模板总结

c++模板总结

模板定义:模板就是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数, 从而实现了真正的代码可重用性。模版可以分为两类,一个是函数模版,另外一个是类模版。

一.函数模板
格式: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);
}