C++之函数模版

243 阅读3分钟

前言

C++ 模版分为函数模版和类模版,和Java中的泛型类似,他们都是为了把类型参数化,因为我们很多时候需要在函数或者类使用的时候再确定类型,比如我们想要定义一个全能数组,调用者可以在数组中插入任意类型的数据,如果不用函数模版的方式,我们就需要写大量的重复代码。需要写不同类型的插入,删除等功能,如果利用模版的技术,只需要写一个插入,删除等功能的函数就能满足用户的需求了。

作用

函数模版的作用是建立一个通用的函数,其函数的返回值类型和形式参数类型都可以不具体指定,用一个虚拟的类型代表。在调用的时候再指定具体的数据类型。增加了代码的复用性。

语法

template<typename T>
函数方法

解释: template: 声明创建的模版

typename: 表面其后的类型是一种数据类型,让编译器不要报错

T:通用数据类型,名称可以自定义,通常为大写字母

注意:typename 可以使用class 代替,即声明模版时也可写成template<class T>的方式,效果是一样的,只是有的人会在函数模版的情况下使用typename,在类模版下使用class.

示例解析

示例

我们用一个简单的两个数交换的例子来解释函数模板的作用。我们先看下代码:

#include<iostream>
using namespace std;

//两个整形交换函数
void swapInt(int &a,int &b)
{
    int temp = a;
    a = b;
    b = temp;
}

//交换两个浮点型函数
void swapDouble(double &a, double &b)
{
    double temp = a;
    a = b;
    b = temp;
}

// 函数模版
template<typename T> // 声明一个模版,告诉编译器后面的代码中紧紧跟的T不要报错,T是一个通用的数据类型
void mySwap(T &a, T &b)
{
    T temp = a;
    a = b;
    b = temp;
}

void test()
{
    int a = 10;
    int b = 20;
    //swapInt(a,b);

   
    mySwap<int>(a,b);
    cout<<"a="<< a<<endl;
    cout<<"b="<< b<<endl;

    double c = 1.1;
    double d = 2.2;
    mySwap<double>(c,d);
    
    cout<<"c="<< c<<endl;
    cout<<"d="<< d<<endl;

}
int main(){
    test();
    system("pause");
    return 0;
}

如上例所示:我们实现两个数交换的函数时,如果不用函数模版,我们需要写多个,就如例子中的交换整型数据时:

//两个整形交换函数
void swapInt(int &a,int &b)
{
    int temp = a;
    a = b;
    b = temp;
}

交换Double型的数据时:

//交换两个浮点型函数
void swapDouble(double &a, double &b)
{
    double temp = a;
    a = b;
    b = temp;
}

这两个交换函数我们发现逻辑都是一样的,但是需要写很多次,假如我们想要交换float,char, string....等,我们就需要写多个逻辑相同的函数,这样是很不好的,代码没有充分的做到复用,所以出现了函数模版的技术:

// 函数模版
template<typename T> // 声明一个模版,告诉编译器后面的代码中紧紧跟的T不要报错,T是一个通用的数据类型
void mySwap(T &a, T &b)
{
    T temp = a;
    a = b;
    b = temp;
}

在上面的代码中,我们将参数的int,double类型都用了一个T代替,在使用的时候,我们想交换啥数据就指定啥类型就可以了:

   mySwap<int>(a,b);
    cout<<"a="<< a<<endl;
    cout<<"b="<< b<<endl;

    double c = 1.1;
    double d = 2.2;
    mySwap<double>(c,d);
    
    cout<<"c="<< c<<endl;
    cout<<"d="<< d<<endl;

函数模版的两种使用方式

函数模版在使用时其实有两种方式,一种是自动类型推导,另一种是显式指定类型

    int a = 10;
    int b = 20;
   // 使用函数模版,两种方式
    // 1.自动类型推导,不用告诉T是一个int类型
    mySwap(a,b);

    //2显示指定类型
    mySwap<int>(a,b);

    cout<<"a="<< a<<endl;
    cout<<"b="<< b<<endl;

自动类型推导就是使用模版时不用指定类型,让编译器自己推导出函数的类型:如交换两个整形值时 直接调用 mySwap(a,b);, 而显示指定类型就是告诉编译器调用的函数需要是什么类型的。mySwap<int>(a,b);

总结

通过本文,我们可以总结出以下几点: 1.函数模版的创建利用关键字template 2.使用函数模版有两种方式:自动类型推导和显示指定类型 3.使用模版的目的是为了提高代码的复用性,将类型参数化