C++模板
模板定义:模板是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数,从而实现了真正的代码可重用性。
模板分类:函数模板和类模板。
函数模板针对参数类型不同的函数;类模板仅针对数据成员和成员函数类型不同的类。
使用模板目的:让程序员编写与类型无关的代码。
注意:模板的声明或定义只能在全局,命名空间或类范围内进行。即不能在局部范围,函数内进行,如不能在main函数中声明或定义一个模板。
一、模板函数
1.一般模板函数
形式:template < typename T>(通用函数定义)或者template < class T>
template <class 形参名,class 形参名,......>
返回类型 函数名(参数列表)
{
函数体
}
其中template和class是关键字,class可以用typename 关键字代替,在这里typename 和class没区别,<>括号中的参数叫模板形参,模板形参和函数形参很相像,模板形参不能为空。
2.特化模板函数
函数模板的特化:当函数模板需要对某些类型进行特别处理,称为函数模板的特化。
//泛型版本
template <class T> int compare(const T &v1, const T &v2)
{
if(v1 < v2) return -1;
if(v2 > v1) return 1;
return 0;
}
对于该函数模板,当实参为两个char指针时,比较的是指针的大小,而不是指针指向内容的大小,此时就需要为该函数模板定义一个特化版本,即特殊处理的版本:
//为实参类型 const char * 提供特化版本
template <> int compare<const char *>(const char * const &v1, const char * const &v2)
{
return strcmp(v1, v2);
}
a: template <> //空模板形参表
b: compare<const char *> //模板名字后指定特化时的模板形参即const char *类型,就是说在以实参类型 const char * 调用函数时,将产生该模板的特化版本,而不是泛型版本,也可以为其他指针类型定义特化版本如int *.
//特化版本 (int *)
template <> int compare<const int *>(const int * const &v1, const int * const