我们都知道c++有函数重载的概念,比如我们写一个相加的函数,以整数为例,我们大概率是这样写:
int Add(int x,int y)
{
return x+y;
}
并且我们知道c++函数重载的概念,于是我们若是想写double类型,float类型,long 类型的Add函数,我们会写好几段相同的代码,只是不同的参数类型罢了;
但是这样会有很多代码冗余,如下:
int Add(int x,int y)
{
return x+y;
}
float Add(float x,float y)
{
return x+y;
}
double Add(double x,double y)
{
return x+y;
}
long Add(long x,long y)
{
return x+y;
}
我们可以看到,上面的代码除了数据类型不同,其他完全一样。
为了减少工作量,c++的创造者设计了新的语法——模板;
初识模板
就像我们人类创造武器或者印刷纸币的时候,会有一个模具,这样就能使用不同的材料创造出相同的东西,而我们的模板也是类似的,它和一个关键字息息相关——template;
而模板又分为类模板和函数模板;
函数模板
函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定 类型版本。
首先是函数模板,我们以上面的Add函数为例,若是使用模板来写,我们应该怎么写呢?
template<class T>
T Add(T x, T y)
{
return x + y;
}
以上便是函数模板的使用方式,而若是想要使用Add函数,
则应该按Add<参数类型>(参数A,参数B)的形式使用;
如下:
模板虽然使用简单,但是也需要遵守以下规则,否则也会出错:
1.模板格式
template<typename T1, typename T2,......,typename Tn>返回值类型 函数名 ( 参数列表 ){}、2.在编译阶段,编译器会根据传入的实参类型来推演生成对应的函数,这也叫函数模板的实例化。3.当出现和函数模板同名的函数时,编译器会有限调用非函数模板函数。4.模板函数不允许隐式类型转换
像这样,Add只有一种类型T,而下面的调用使用了a和b俩种不同类型的实参进行传参;
这样会导致错误,若是想传不同类型的数据则应该多用几个模板;
比如这样。
类模板
类模板实例化需要在类模板名字后跟 <> ,然后将实例化的类型放在 <> 中即可,类模板名字不是真正的类,而实例化的结果才是真正的类 。
随着我们学习的深入,我们会学到各种各样的容器,而这些容器可能需要容纳各种类型的数据,因此它们都统一使用了类模板,如vector,list之类的。
类模板格式
template < class T1 , class T2 , ..., class Tn >class 类模板名{// 类内成员定义};
而我们平时使用则是这样使用的:
int main()
{
vector<int> arr1;
vector<char> arr2;
vector<string> arr3;
return 0;
}
和函数模板一样都需要我们将数据类型传过去,才能使用对应容器。
以上就是模板的内容,比较简单,谢谢大家~~