模板初阶(C++)
初识模板
void Swap(int& left, int& right)
{
int temp = left;
left = right;
right = temp;
}
void Swap(double& left, double& right)
{
double temp = left;
left = right;
right = temp;
}
void Swap(char& left, char& right)
{
char temp = left;
left = right;
right = temp;
}
函数模板
template是模板函数的关键字有的也会写成class,(但是两者在后面会有明显的区别后面会结合具体案例进行介绍这里不进行深入介绍),typename 指的是类型名称 ,这里的T是取自type的简写,T可以置换成其他字母也是可以的。模板参数的类型是根据传入的参数进行自动识别类型,在遇见传入参数类型不同,需要为不同的类型进行分别做标记。
//调用相同类型的模板
template<typename T>
//调用不同类型的模板
template<typename T1,typename T2>
函数模板使用案例:
1.调用相同类型
#include<iostream>
using namespace std;
template<typename T>
void Swap(T& left, T& right)
{
T temp = left;
left = right;
right = temp;
cout << left <<" " << right << endl;
}
int main()
{
int a = 2, b = 3;
double c = 3.3, d = 4.4;
Swap(a, b);
Swap(c, d);
}
2.调用不同类型
这里是模板参数类型不同的情况,a和c的类型不同,这里有两种解决办法。1.用户自身进行转换。2.就是进行显式实例化。我这里用了用户自身强制转换。
函数模板的原理
上面案例,我们会产生一个疑问使用函数模板调用的是同一个函数吗?这里我们可以通过反汇编观察一下底层代码函数是如何进行调用的,这里可以看出调用的并不是一个函数,而是两个函数。
显式实例化
在函数名+ <> 中指定模板参数的实际类型
隐式实例化
隐式实例化是通过自动识别的,隐式实例化如果遇见参数列表中,参数不同时就会报错。
为什么当出现同名,同条件时会优先调用非函数模板
在调用函数模板的时候会首先,要分别自动识别各个参数的类型,在识别后才会进行函数的调用,而非函数模板是不用调用可以直接执行的。所以会优先调用非函数模板。如果出现调用参数类型与非函数模板不同时就会优先调用函数模板。
int add(int left, int right)
{
return (left + right)*2;
}
template<typename T>
T add( T left, T right)
{
return left + right;
}
int main()
{
int a = 2, b = 3;
cout << add(a,b) << endl;
return 0;
}
类模板
template<typename/class T,typename/class T,.....>
class 类名
{
}
类模板的实例化
类模板的类型:类模板名字<参数类型>
补充:类模板只能显示实例化,因为类模板并未进行构造传参。所以类的类型的书写形式是 类模板名字<参数类型>。
如何在类模板范围之外使用类模板
在类模板中声明和定义不能分离,因为类模板使用的范围只能在类的里面出了就不能再进行使用,如果使用就会进行报错
解决方案:
总结
以上就是本次知识点总结主要涉及函数模板和类模板基础知识点,以及使用的语法细节,最后期待能留下你的一键三连(点赞,关注,收藏)。