首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 模板類深度解析:從基礎到偏特化與模板模板參數

     編輯:關於C++

引言

模板是 C++ 泛型編程的核心。本文通過完整示例,系統梳理模板類的定義、顯式特化、偏特化、巢狀模板、模板模板參數等進階用法。

1. 基礎模板類與默認參數

template <class T1, class T2 = string>
class Test {
    T1 val1; T2 val2;
public:
    Test() {}
    Test(T1 a, T2 b) : val1(a), val2(b) {}
    void show();
};

// 類外定義成員函數
template <class T1, class T2>
void Test<T1, T2>::show() {
    cout << "原始模板" << endl;
    cout << val1 << endl << val2 << endl;
}

2. 顯式特化

為特定類型提供完全不同的實現:

template <>
class Test<int, int> {
    int val1, val2;
public:
    Test() {}
    Test(int a, int b) : val1(a), val2(b) {}
    void show() {
        cout << "全特化 int,int" << endl;
        cout << val1 << endl << val2 << endl;
    }
};

3. 偏特化

僅固定部分模板參數:

template <class T>
class Test<T, double> {
    T val1; double val2;
public:
    Test() {}
    Test(T a, double b) : val1(a), val2(b) {}
    void show() {
        cout << "偏特化 T,double" << endl;
        cout << val1 << endl << val2 << endl;
    }
};

4. 顯式實例化

template class Test<double, double>;
// 強制編譯器生成該具體類型的代碼,不與特化衝突

5. 巢狀模板類作為成員

template <class T1>
class Outer {
    template <class T2>
    class Inner {
        T2 data;
    public:
        Inner(T2 d) : data(d) {}
        void show() { cout << data << endl; }
    };
    Inner<T1> member;
public:
    Outer(T1 d) : member(d) {}
    void show() { member.show(); }
};

6. 模板模板參數

接受模板作為參數,增強泛化能力:

template <template <class, class> class Container>
class Wrapper {
    Container<int, int> obj;
public:
    Wrapper(Container<int, int> o) : obj(o) {}
    void show() { obj.show(); }
};

7. 綜合測試

int main() {
    // Test<int> a(1, "str");      // 使用默認 string
    // Test<double, double> b(5, 6); // 隱式實例化
    // Test<int, int> c(5, 6);      // 匹配全特化
    // Test<int, double> d(1, 2.1);  // 匹配偏特化
    // Outer<int> e(1);             // 巢狀模板
    // Test<int, int> f(1,2); Wrapper<Test> g(f); // 模板模板參數
    return 0;
}

關鍵點總結

  • 特化版本必須在原模板聲明之後定義。
  • 偏特化只能用於類模板,不能用於函數模板。
  • 模板模板參數要求參數模板的參數列表完全匹配。
  • 默認模板參數僅允許出現在參數列表末尾。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved