目录
我们知道,C++可提升程序可重用性有两个方面的机制,第一个就是我们之前学过的类继承,第二个就是我们今天要讲的主题"函数模板"和"类模板",类模板在明天讲,今天首先先给大家讲解简单一些的"函数模板"!
比如说我们来写一个函数,就swap吧,其作用就是交换两个变量的值,但是变量有int,float,double......很多类型的,肯定不能只写一个swap函数,要很多个,这就是涉及到了函数重载了,这些swap虽然名字一样,但是参数里面的类型不一样,就不会编译出错!
- void swap(int &a,int &b){
- int t;
- t=a;
- a=b;
- b=t;
- }
- void swap(double &a,double &b){
- double t;
- t=a;
- a=b;
- b=t;
- }
当然,还有很多类型的交换函数,这里就不重点讲了!
......
让我们想一想,用函数重载的方式写不同类型变量的swap有没有缺点呢?肯定是有的,什么缺点呢?第一:定义这些函数需要的代码太长了.第二:函数重载不太好理解.第三:又耗时.
那我们有没有一种两全其美的方法呢?那肯定是没有的,但是有着一种可以缩短很多代码的方法,那就是"函数模板".
函数模板是什么呢?众所周知,有了“模子”后,用“模子”来批量制造陶瓷、塑料、金属制品等就变得容易了。程序设计语言中的模板就是用来批量生成功能和形式都几乎相同的代码的。有了模板,编译器就能在需要的时候,根据模板自动生成程序的代码。从同一个模板自动生成的代码,形式几乎是一样的。
- 用函数模板解决:
- template <class 类型参数1,class 类型参数2,……>
- 返回值类型 模板名 (形参表)
- {
- 函数体
- };
以后大家都可以根据这个写法来完成函数模板,
用上述写法来套一下,我们因为只需要一个类型(毕竟swap函数里面的a,b,t都是一个类型的),所以在template中只需要写class T就可以了,T是什么呢?这个就代表我们函数的类型,可以是int,可以是double,都可以代表任何类型.
返回值类型一直都是void,然后模板名肯定就是swap了,形参表里面不能写int a,int b,也不能写float a,float b.因为这样写就不是一个模板了,必须要写咋template里定义的那个类型,我们定义的就是T.所以要写T a,T b.
函数体里面写一个交换的内容,但是这个t的类型是什么好呢?int类型不行,因为这个参数可能是一个float类型的,double也不行,也就只能写函数模板的参数T了.
- #include
- using namespace std;
- template <class T>
- void Swap(T & x,T & y)
- {
- T tmp = x;
- x = y;
- y = tmp;
- }
- int main()
- {
- int n = 1,m = 2;
- Swap(n,m); //编译器自动生成 void Swap(int & ,int & )函数
- double f = 1.2,g = 2.3;
- Swap(f,g); //编译器自动生成 void Swap(double & ,double & )函数
- return 0;
- }
这样的话,在int main();里面调用swap函数,里面的两个参数无论是什么都可以运行了!
函数模板中可以有不止一个类型参数,我们来看这一串代码。
- #include
- using namespace std;
- template <class T1, class T2>
- T2 print(T1 arg1, T2 arg2)
- {
-