• C++函数模板


    C++函数模板允许以任意类型的方式来定义函数。例如,可以这样建立一个交换模板:

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

    在标准C++98添加关键字typename之前,C++使用关键字class来创建模板。也就是说,可以这样编写模板定义:

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

    需要多个对不同类型使用同一种算法的函数时,可使用模板。然而,并非所有的类型都使用相同的算法,为满足这种需求,可以像重载常规函数定义那样冲在模板定义。和常规重载一样,被重载的模板的函数特征必须不同。

    下面的例程中新增了一个交换模板,用于交换两个数组中的元素。

    #include <iostream>
    using namespace std;
    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 main() {
        int x = 1, y = 2;
        Swap(x, y);
        cout << x << "	" << y << endl;
        int a[10], b[10], n = 10;
        for (int i = 0; i < 10; i ++)
            a[i] = i + 1, b[i] = 10 - i;
        Swap(a, b, 10);
        Show(a);
        Show(b);
        return 0;
    }
    
    template <typename T>
    void Swap(T &a, T &b) {
        T 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[]) {
        for (int i = 0; i < 10; i ++)
            cout << a[i] << " ";
        cout << endl;
    }

    输出效果:

    2   1
    10 9 8 7 6 5 4 3 2 1
    1 2 3 4 5 6 7 8 9 10

    显式具体化

    实例(实际运行有错误,可能是编译器版本问题):

    #include <iostream>
    using namespace std;
    template <typename T>
    void Swap(T &a, T &b);
    
    struct job
    {
        char name[40];
        double salary;
        int floor;
    };
    
    // explicit specialization
    template <> void Swap<job>(job &j1, &j2);
    void Show(job &j);
    
    int main() {
        int a = 1, b = 2;
        Swap(a, b);
        cout << a << "	" << b << endl;
        job j1 {"moon", 3000.3, 2};
        job j2 {"lit", 2000.2, 1};
        Swap(j1, j2);
        Show(j1);
        Show(j2);
        return 0;
    }
    
    template <typename T>
    void Swap(T &a, T &b) {
        T temp = a;
        a = b;
        b = temp;
    }
    
    template <> void Swap<job>(job &j1, job &j2)
    {
        double t1;
        t1 = j1.salary;
        j1.salary = j2.salary;
        j2.salary = t1;
        int t2;
        t2 = j1.floor;
        j1.floor = j2.floor;
        j2.floor = t2;
    }
    
    void Show(Job &j) {
        cout << j.name << "	" << j.salary << "	" << j.floor << endl;
    }

    这里提示:template <> void Swap<job>(job &j1, &j2);出错。

    实例化和具体化

    。。。

  • 相关阅读:
    LVS的持久连接、会话保持和高可用介绍
    lvs整理
    ubuntu 12.04 下LVS的一些搭建心得和资料整理
    Ubuntu下配置LVS【h】
    关于vector push_back()与其他方式读取数据的效率对比(转)
    强大的vim配置文件,让编程更随意(转)
    E492: Not an editor command: ^M
    Building Vim from source(转)
    误删 libc.so.6的解决方法(转)
    CentOS安装glibc-2.14(转)
  • 原文地址:https://www.cnblogs.com/moonlightpoet/p/5651702.html
Copyright © 2020-2023  润新知