函数模板一

来源:互联网 发布:微信联系人数据库修复 编辑:程序博客网 时间:2024/06/07 02:43

c++新增特性–函数模板。函数模板是通用的函数描述,也就是说,采用泛型编程,其中的泛型可以使用具体的类型(如int或double)替换,通常将类型作为参数传递给模板,可使编译器生成该类型的函数。

应用场景:比如现在已有一个交换两个 int 值的函数 Swap,当我们想交换两个 double 值时或 char 值时,一种办法是复制原先的代码,将 int 全部改为double或char,而c++的函数模板功能可以方便的完成这一功能,函数模板允许以任意类型的方式定义函数。

一. 函数模板的定义

template <typename T>void Swap(T &a,T &b){    T temp;    temp=b;    b=a;    a=temp;}

第一行指出要建立一个模板,①关键字template和typename不可少(有时可以使用class代替typename),并将此类型命名为T;②必须使用尖括号;③类型名可以任意选择,只要符合c++命名规则即可。

下面的栗子描述交换两个值的程序:

#include <iostream>using namespace std;template<typename T>//模板原型void Swap(T &a,T &b);int main(){    int a=12,b=34;    cout<<"Original,a,b= "<<a<<","<<b<<endl;    Swap(a,b);    cout<<"Now,a,b= "<<a<<","<<b<<endl;    double c=12.0,d=34.12;    cout<<"Original,c,d= "<<c<<","<<d<<endl;    Swap(c,d);    cout<<"Now,c,d= "<<c<<","<<d<<endl;    return 0;} template<typename T>//模板定义void Swap(T &a,T &b){    T temp;    temp=a;    a=b;    b=temp;}

输出:
这里写图片描述

注意:函数模板不能缩短可执行程序,对于此程序来说,最终有两个独立的函数定义,就像以手工方式定义了这两个函数一样。最终代码不包括任何模板,而只包含了为程序生成的实际函数。使用模板的好处是,它使生成多个函数定义更简单、更可靠。

2. 重载的模板

需要多个对不同类型使用同一算法的函数时,可使用模板,然而,并非所有的类型都使用同一算法,此时,可以像常规函数重载 那样,重载模板函数,被重载的模板函数特征标必须不同。例如,在上述交换两个值的模板基础上,新增交换两个数组元素的模板,原来的模板特征标是(T &a,T &b),现在的模板特征标是(T a[ ],T b[ ], int n)。

将上述例子加入模板重载之后,程序如下:

#include <iostream>using namespace std;const int MaxNum=4;template<typename T>//模板原型void Swap(T &a,T &b);template<typename T>void Swap(T a[],T b[], int n);template<typename T>void show(T a[],int n);int main(){    int a=12,b=34;    cout<<"Original,a,b= "<<a<<","<<b<<endl;    Swap(a,b);    cout<<"Now,a,b= "<<a<<","<<b<<endl;    double c=12.0,d=34.12;    cout<<"Original,c,d= "<<c<<","<<d<<endl;    Swap(c,d);    cout<<"Now,c,d= "<<c<<","<<d<<endl;    int arr1[MaxNum]={1,2,3,4};    int arr2[MaxNum]={5,6,7,8};    cout<<"Original, arr1数组元素有: "<<endl;    show(arr1,MaxNum);    cout<<"Original, arr2数组元素有: "<<endl;    show(arr2,MaxNum);    Swap(arr1,arr2,MaxNum);    cout<<"Now, arr1数组元素有: "<<endl;    show(arr1,MaxNum);    cout<<"Now, arr2数组元素有: "<<endl;    show(arr2,MaxNum);    return 0;} template<typename T>//模板定义void Swap(T &a,T &b){    T temp;    temp=a;    a=b;    b=temp;}template<typename T>void Swap(T a[],T b[], int n){    for (int i=0;i<n;i++)    {        T temp;        temp=a[i];        a[i]=b[i];        b[i]=temp;    }}template<typename T>void show(T a[],int n){    for (int i=0;i<n;i++)    {        cout<<"数组的第"<<i+1<<"个元素:"<<a[i]<<endl;    }}

输出:
这里写图片描述