泛型编程:
C++中一种使用模板来实现代码重用和类型安全的编程范式。它允许程序员编写与数据类型无关的代码,从而可以用相同的代码逻辑处理不同的数据类型。模板是泛型编程的基础
模板分为两类:
-
函数模板:代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生 函数的特定类型版本
-
类模板
函数模板:
代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生 函数的特定类型版本
提供一个函数的模板,但是类型是不固定的,对于这种编程也叫泛型编程
Template<typename T1, typename T2,......,typename Tn>//模板格式template<typename T>//T是一个类型的名称,没有要求;typename是一个关键字,后面跟的是泛型类型的名字,typename也能换成class。typename T合起来就是一个模板参数
void Swap(T& left,T& right)
{T temp = left;left = right;right = temp;
}
template<typename T>
void Swap(T& left,T& right)
{T temp = left;left = right;right = temp;
}
int main()
{int x = 1, y = 2;double m = 1.1, n = 2.2;Swap(x,y);//这里两处函数调用,看似调用的是一个函数,但实际上时调用了两个函数(函数调用要建立栈帧,一个是int类型,一个double类型,类型大小都不一样,更不可能调用的是同一个函数了),这个可以从汇编层来观察Swap(m,n);return 0;
}
观察汇编代码发现,call的地址不一样,说明调用的不是同一个函数。
原理:
编译器通过你编写的模板,再根据你传入的参数,自行生成对应的函数,调用的就是这个编译器自行生成的函数
如果你传入两个参数,这两个参数的类型不一样,就需要写两个模板参数,否则编译会不通过
正确做法如下:
template<typename T1, typename T2>
void Swap(T1&left,T2&right)
{T1 temp = left;left = right;right = temp;
}
int main()
{int x = 1, y = 2;double m = 1.1, n = 2.2;Swap(x,n);Swap(m,y);return 0;
}