[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;
}