c++函数模板

本文详细介绍了C++中的函数模板定义及其应用,包括基本的交换函数模板实现、模板重载、显示具体化的概念与实例,展示了如何根据不同需求灵活使用模板。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.函数模板的定义:

   下例中建立了一个交换两个数的函数模板:

template <typename T> //也可以用template <class T> 这里T可以改成其他任意名字
void Swap(T &a, T &b)
{
    T temp;
    temp = a;
    a = b;
    b = temp;
}
2.函数模板的演示实例:

#include <iostream>
using namespace std;

template <typename T>  //或者 template <class T>
void Swap(T &a, T &b);

int main()
{
    int i = 10, j = 20;
    cout << "i = " << i << ", j = " << j << endl;
    Swap(i, j);
    cout << "Now i = " << i << ", j = " << j << endl;

    cout << endl;
    double m = 10.2, n = 12.1;
    cout << "m = " << m << ", n = " << n << endl;
    Swap(m, n);
    cout << "Now m = " << m << ", n = " << n << endl;
    return 0;
}

template <typename T>   //或者 template <class T>
void Swap(T &a, T &b)
{
    T temp;
    temp = a;
    a = b;
    b = temp;
}
运行结果:


3.模板的重载

   模板的重载,就是定义一个模板,然后可以在这个模板里面定义不同的参数类型或者参数个数

   实例:

#include <iostream>
using namespace std;
const int size = 8;

template <typename T>
void Swap(T &a, T &b);     //这个模板交换两个数字

template <typename T>
void Swap(T a[], T b[], int n);   //这个模板交换两个数组中的元素

void show(int a[], int n);

int main()
{
    int i = 10, j = 20;
    int d1[size] = {0,7,0,4,1,7,7,6};
    int d2[size] = {0,7,2,0,1,9,6,9};
    cout << "i, j = " << i << j << endl;
    cout << "Using compiler-generated int swapper: " << endl;
    Swap(i, j);
    cout << "Now i, j = " << i << ", " << j << endl;

    cout << "Original arrays: " << endl;
    show(d1, size);
    show(d2, size);
    cout << "Swapped arrays: " << endl;
    Swap(d1, d2, size);
    show(d1, size);
    show(d2, size);
    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) //交换两个数组中的各个数字
{
    T temp;
    for(int i = 0; i < n; i++)
    {
        temp = a[i];
        a[i] = b[i];
        b[i] = temp;
    }
}

void show(int a[], int n)
{
    cout << a[0] << a[1] << "/";
    cout << a[2] << a[3] << "/";
    for(int i = 4; i < n; i++)
        cout << a[i];
    cout << endl;
}
运行结果:


4.显示具体化

  ①问:为什么要用显示具体化?

       答:假如定义了如下结构体

struct job
{
   char name[30];
   double salary;
   int floor;
};
 定义了两个job变量job1,job2,想交换job1和job2的所有信息(name,salary,floor),则直接用上例中的Swap是可以进行交换的;但是如果只想交换job1和job2信息的一部分,则直接用上述的Swap函数是不行的,需要用到显示具体化。

   ②显示具体化的定义:

template<> void Swap<job>(job &a, job &b)         //显示具体化定义
{
    double temp1;
    temp1 = a.salary;
    a.salary = b.salary;
    b.salary = temp1;

    int temp2;
    temp2 = a.floor;
    a.floor = b.floor;
    b.floor = temp2;
}
    ③如果在一段程序中,同时有多个原型,则编译器在选择原型时,优先级如下:非模板函数 > 显示具体化 > 模板函数。即如果在程序中出现了三个Swap函数,则优先调用非模板定义的Swap函数,若没有非模板定义的Swap函数,则调用显示具体化的Swap函数,若前两者都没有,则调用模板函数定义的Swap函数。

    ④显示具体化的实例:

/***演示如何使用函数模板及显示具体化 ***/
/***定义了一个模板函数,以及一个显示具体化***/

#include <iostream>
using namespace std;

template<typename T>
void Swap(T &a, T &b);     //函数模板申明

struct job
{
    char name[30];
    double salary;
    int floor;
};

template<> void Swap<job>(job &a, job &b);        //显示具体化申明
void show(const job a);                           //常规函数申明

int main()
{
    int i = 10, j = 20;
    job sue = {"zhangfei", 10000.0, 2};
    job sidney = {"liubei", 12000.0,1};
    cout << "Original:" << endl;
    cout << "i, j = " << i << ", " << j << endl;
    cout << "Swapped: " << endl;
    Swap(i, j);                                   //调用函数模板
    cout << "Now i, j = " << i << ", " << j << endl << endl;

    cout << "Before job swapping: " << endl;
    show(sue);
    show(sidney);                                 //调用普通函数

    cout << "After job swapping: " << endl;
    Swap(sue, sidney);                            //调用显示具体化
    show(sue);
    show(sidney);
    return 0;
}

template<typename T>
void Swap(T &a, T &b)                             //函数模板定义
{
    T temp;
    temp = a;
    a = b;
    b =temp;
}

template<> void Swap<job>(job &a, job &b)         //显示具体化定义,交换salary 和 floor
{
    double temp1;
    temp1 = a.salary;
    a.salary = b.salary;
    b.salary = temp1;

    int temp2;
    temp2 = a.floor;
    a.floor = b.floor;
    b.floor = temp2;
}

void show(const job a)                             //常规函数定义
{
    cout << "Name: " << a.name << endl;
    cout << "Salary: " << a.salary << endl;
    cout << "Floor: " << a.floor << endl << endl;
}
运行结果:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值