當前位置 主頁 > 網站技術 > 代碼類 > 最大化 縮小

    C++ 泛型編程詳解

    欄目:代碼類 時間:2020-02-06 21:08

    泛型編程與面向對象編程的目標相同,即使重用代碼和抽象通用概念的技術更加簡單。但是面向對象編程強調編程的數據方面,泛型編程強調的是獨立于特定數據類型。

    這一篇介紹一下 C++ 編程中與面向對象并列的另一大分支——泛型編程,這一篇主要介紹函數模板、類模板和成員模板三大部分

    如有侵權,請聯系刪除,如有錯誤,歡迎大家指正,謝謝

    泛型編程

    模板是泛型編程的一種重要思想,STL(Standard Template Library,標準模板庫)是采用模板實現的一個實例
    函數模板

    對比函數重載(同一作用域內函數名相同,參數列表不同的函數),函數模板只需要一個函數就實現了函數重載的部分功能(參數個數相同類型不同,函數重載需要定義多個同名參數列表不同的函數)

    template<typename T, typename Y> // 這也可以寫 template<class T, class Y> 此處的 class 和 typename 作用相同
    void tfunc(T& t, Y& y) {
     cout << t << " " << y << endl;
    }
    int n = 2;
    double d = 2.1;
    tfunc(n, d);
    
    // 運行結果:2 2.1

    函數模板具體化,函數模板具體化就是將某一(某幾)個要處理的類型單獨處理,需要單獨寫一個實現,形式是 template<> void fun(type& t);,函數模板的具體化和普通函數可以同時存在,調用順序是 普通函數 > 函數模板具體化 > 模板函數

    // ====== 測試一:函數模板針對特殊數據類型具體化 ======
    struct Node {
     int val;
     Node* next;
    };
    // 函數模板
    template<typename T> 
    void tfunc(const T& t) {
     cout << "template: " << t << endl;
    }
    // 函數模板具體化(用于處理Node類型數據)
    template<> 
    void tfunc<Node>(const Node& node) {
     cout << "template<Node>: " << node.val << endl;
    }
    // 函數模板具體化(用于處理int類型數據)
    template<> 
    void tfunc<int>(const int& n) {
     cout << "template<int>: " << n << endl;
    }
    // 普通函數
    void tfunc(const int& n) {
     cout << "tfunc(): " << n << endl;
    }
    double d = 2.1;
    tfunc(d); // 函數模板未具體化double類型函數,調用模板
    Node node{ 2, nullptr };
    tfunc(node); // 函數模板具體化Node類型函數,調用函數模板的具體化
    int n = 2;
    tfunc(n); // 函數模板具體化int類型函數,也存在普通函數,調用普通函數
    // ====== 測試二:函數模板部分具體化 ======
    template<typename T1, typename T2>
    void tfunc(T1 t1, T2 t2) {
     cout << typeid(T1).name() << " and " << typeid(T2).name() <<": " << t1 << " " << t2 << endl;
    }
    template<typename T1>
    void tfunc(T1 t1, int i) {
     cout << typeid(T1).name() << " and " << "int: " << t1 << " " << i << endl;
    }
    template<typename T2>
    void tfunc(long l, T2 t2) {
     cout << "long and " << typeid(T2).name() << ": " << l << " " << t2 << endl;
    }
    template<>
    void tfunc(short l, int i) {
     cout << "long and int: " << l << " " << i << endl;
    }
    // 分別調用以上四個模板函數
    tfunc(char('c'), char('c'));
    tfunc(char('c'), int(10));
    tfunc(long(10), char('c'));
    tfunc(short(10), int(10));

    函數模板實例化,讓編譯器生成指定類型的函數定義,不用寫函數的實現,形式是 template void fun(type& t);

    下一篇:沒有了
777亚洲人成视频免费视频