#include <iostream>
using namespace std;
/*
把数据的类型也当做参数传入,减少代码重用,使代码不受类型的限制
*/
int maax(int a,int b)
{
return a>b?a:b;
}
double maax(double a,double b)
{
return a>b?a:b;
}
float maax(float a,float b)
{
return a>b?a:b;
}
//求两者的最大值,只有传入的类型不同,内部的算法都一样(代码冗余),就可以模板函数
template<typename type1>//定义一个类型"变量",可以表示一个类型
type1 maax(type1 a,type1 b)//这里计算机自己会通过你出入的参数进行推演,(参数是什么类型type1就被赋为上么类型)
{
cout<<"ads"<<endl;
return a>b?a:b;
}
/*
函数模的效率不高,函数模板在调用的时候会自动生成具体的对应类型的函数模板再进行执行.(即上面的几个类型的函数,但好处就是减少代码重用).
*/
template<typename type1,typename type2>
type1 maax(type1 a,type2 b)
{
return a>b?a:b;
}
int main()
{
maax('a','b');
maax(1,2);
maax(1.2,3.4);
maax(1.2f,3.4f);//小数默认转化为 double,除非在后面加上 f 限定.
/*
maax(2,2.1);
如果只有一个int型的函数,那么程序就会把小数默认转化为int型进行int maax(int ,int );函数;
但是对于type1 maax(type1 a,type1 b)模板函数
传入的两个参数的类型赋给type1
这时两个type1不一样一个 int 一个 double(模板不会强制转换)
于是计算机就不能进行正常推演type1的类型;
那该怎么办呢?
*/
maax(2,(int)2.1);//他不会默认转化那我们就给他强制;
maax((double)1,2.1);//或者强转为double;
maax<int>(2,2.1);//这是一个新操作,用一个尖括号我们主动地把typ1的类型传入为int类型.这时模板函数就不需要自己自动推演type1了.
maax(2,2.1);//最后一个模板函数,一个type1 不够那我就在弄一个"类型变量",.两个一个推演为int,一个推演为double.
// maax(test a,test b);//这还是调用模板函数,type1会赋为test类型.编译出错是因为没有对 > 进行重载,重载一下这个符号就好了.
cout << "Hello world!" << endl;
return 0;
}