1)问题引入-->为啥有函数模板
---->首先是,我们编写一个 交换两个数的C语言代码:
1 #include<iostream> 2 3 using namespace std; 4 //加入这两个数是整数 5 void jiaohuan(int a,int b) 6 { 7 a=a+b; 8 b=a-b; 9 a=a-b; 10 } 11 12 //要是两个数double型的 13 void jiaohuan(double a,double b) 14 { 15 a=a+b; 16 b=a-b; 17 a=a-b; 18 } 19 20 int main() 21 { 22 23 24 return 0; 25 }
看,我同样是交换两个数,根据不同的数据类型,可能写很多不同类型的函数,那么就增加了维护成本,因为,你每编写一个函数,就得需要维护,
那么 怎么解决这个问题?
就用模板技术--->模板是啥,就是类型参数化,编写代码可以忽略类型,用一个标志或者符号
为了让编译器区分是 普通函数还是模板函数 所以 得告诉编译器----->我要编写模板函数了,所以就有了一个关键子--->template
编写模板函数的步骤:
1)写上关键子 template
2)因为,你的函数不同的类型 你得用一个自己的名字代替 那么就有了
template <class 你起的变量的名字> 或者 template <typename 你起的变量的名字> ----->这个就是告诉编译器 我下面要写模板函数了,所以啊,你要是遇到奇怪的东西 不要报错。
3)然后写我的模板函数了:
1 //下面是模板函数 2 template <class wangchao> 3 void hh(wangchao &a,wangchao &b) 4 { 5 a=a+b; 6 b=a-b; 7 a=a-b; 8 } 9 int main() 10 { 11 12 int a=3; 13 int b=4; 14 hh(a,b); 15 cout<<a<<endl; 16 cout<<b<<endl; 17 return 0; 18 }
注意:
1)template <class t1,class t2.class t3~~~~~~~~~~~~~~~> 这个尖括号里面可以写很多个,并不是只有一个的
2)templata仅仅对它下面的第一个函数有作用,第二个就不起作用了,所以 你还得重新定义你的template<class tt>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
上面的模板方法在main中能运行,怎么判断的变量类型:
1)上面的 hh(a,b) 是编译器自动推导的,根据你调用模板方法时传的参数类型,去替换掉你编写模板方法时 写的那个自己的变量类型wangchao
2)可以显式指定类型----> hh<int>(a,b) 就是告诉编译器,我的传的值是int的