函数模板一

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;
    }
}

输出:
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值