目录
泛型编程
什么是泛型编程?泛型编程相当与一个函数家族,不关乎类型,通过参数的不同类型可以在编译阶段推演出相应的程序。同时还有一个问题,既然我们有函数重载,那么为什么还需要泛型编程。
int add(int a,int b)
{
return a+b;
}
int add(double a,double b)//此时我们用的是函数的重载
{
return a+b;
}
template <class T>//这里用的是泛型编程
T add(T a,T b)
{
return a+b;
}
从上面的程序可以看出,使用函数重载是可以实现各种不同类型的函数,但可以看出,如果出现新的类型,又要重新写,所以复用率不高。
函数模板
函数模板是一个函数家族,通过类型不同可以由编译器编译出不同的函数。
函数模板的格式
template<class T>
T add(T a,T b)
{
return a+b;
}
函数模板的原理
通过编译器的推演,根据不同的参数类型,实例化出不同的函数
函数模板的实例化
隐式类型转换:就正常按函数模板转换
显示类型转换:显示的转换
template<class T c>
add<int> (a,b)//转化Int
函数匹配的三点原则
1 一个非模板函数可以和一个同名的模板函数同时存在,而且这个函数模板可以实例化出这个非模板函数。
2,如果非模板函数更适合,就直接用非模板函数。
template<class T>// 模板函数
T Add(T a,T b)
{
return a+b;
}
double Add(int a,double b)//非模板函数
{
return a+b;
}
int main()
{
a=1;
b=2;
c=1.2;
Add(a,b);//此时模板函数
Add(a,c);//用非模板函数
3 非模板函数不能进行隐士类型转换,而普通的函数可以