C++模板的使用
在c++中我们有时候会遇到需要我们写很多结构类似的代码段,为了减小我们的代码量,聪明的程序员们就想出了一种
可以减小代码量的方法,当遇到相同结构的代码段时,我们制造一个模板,通过一个泛型来代替所有类型,所谓模板,
就是编译器自动根据所给的类型自动生成想要的类型
函数模板
函数模板不是一个单纯的函数,它代表的是一个家族,与类型无关,在使用时函数模板会根据参数的类型生成与之对应的函数版本。
在上图中,template表示的是泛型模板,class代表的类,也可以用typename替代class,此处的T表示的一个泛型类型,可以是int、char、double等,此处是一个加法函数,当传入实参时,编译器会自动根据参数类型进行生成模板,具体过程如下:
函数模板的实例化
函数模板的实例化分为显式实例化和隐式实例化,在不同的情况下采用最适当的实例化方式,如下:
tempate<class T>
T Add(const T& a,const T& b)
{
return a+b;
}
int main()
{
//隐式实例化,编译器自动推导出类型
int a=1,b=2;
double c=1.2,d=2.3;
Add(c,d);//编译器自动推导出类型为double
Add(a,b);//编译器自动根据类型推导出返回值为int类型
//显示实例化:需要人为地去定义返回值的类型
Add(a,c);//此时编译器会报错,因为他不确定自动推导为int还是double,此时一般有两种方法:
//1.进行强转
Add(a,(int)c);//此时参数都为int,返回值也为int
//2.进行显式实例化
Add<int>(a,c);
return 0;
}
函数模板的匹配原则
-
1.在代码中可以同时包含与模板函数同名的非模板函数,在实例化时模板函数可以实例化为非模板函数类型*
-
2.对于非模板函数和同名模板函数,在其他条件相同时,会优先调用非模板函数,这样就会给编译器省去复杂的实例化过程,大大的提高了代码的运行效率*
-
3.函数模板的调用采用就近最匹配原则,如果函数模板实例化可以生成更匹配的则选择模板函数,模板函数不允许自动进行类型转换,而普通函数可以*
类模板的使用
template<class T1,class T2,class T3......,class Tn>
class 类模板名
{
}
类模板的实例化和函数模板的实例化不同,类模板的实例化必须在类名后面跟<>,<>里面为类的类型,类模板
的名字不是真正的类,实例化后的结果才是真正的类
Vector类名
vector<int>是类型
以上是此次学习函数模板与类模板的一些总结,希望大家勇于纠错改正