類别範本

yaoguyuan發表於2024-12-01

[Lang] 類别範本

完全特化與偏特化:

特性 完全特化(Full Specialization) 偏特化(Partial Specialization)
定義 為特定型別提供完全的實現 為型別引數的部分組合提供定製的實現
模板引數 必須指定所有的模板引數 可以只指定一個或部分模板引數
示例 template <> class MyClass<int> {...} template <typename T2> class MyClass<int, T2> {...}
#include <iostream>
using namespace std;

// 通用類别範本
template <typename T>
class MyClass {
public:
    void display() {
        cout << "Generic template" << endl;
    }
};

// 對 int 型別進行完全特化
template <>
class MyClass<int> {
public:
    void display() {
        cout << "Specialized for int" << endl;
    }
};

int main() {
    MyClass<double> obj1;
    obj1.display();  // 輸出:Generic template

    MyClass<int> obj2;
    obj2.display();  // 輸出:Specialized for int

    return 0;
}
#include <iostream>
using namespace std;

// 通用類别範本
template <typename T, typename U>
class MyClass {
public:
    void display() {
        cout << "Generic template" << endl;
    }
};

// 對第一個引數為 int 型別進行偏特化
template <typename U>
class MyClass<int, U> {
public:
    void display() {
        cout << "Partial specialization: T is int" << endl;
    }
};

// 對第一個引數為指標型別進行偏特化
template <typename T, typename U>
class MyClass<T*, U> {
public:
    void display() {
        cout << "Partial specialization: T is pointer" << endl;
    }
};

int main() {
    MyClass<double, double> obj1;
    obj1.display();  // 輸出:Generic template

    MyClass<int, double> obj2;
    obj2.display();  // 輸出:Partial specialization: T is int

    MyClass<double*, double> obj3;
    obj3.display();  // 輸出:Partial specialization: T is pointer

    return 0;
}

相關文章