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>是类型

以上是此次学习函数模板与类模板的一些总结,希望大家勇于纠错改正

更多推荐

C++模板使用