在 C++ 中,模板特化分为全特化(full specialization)和偏特化(partial specialization)。它们允许程序员为特定类型或类型模式提供不同的实现,以覆盖通用模板的默认行为。
模板全特化
模板全特化是指为某个特定的模板参数提供专门的实现。全特化通常用于处理某个特定类型的特殊情况。
类模板全特化
以下是一个类模板全特化的示例:
#include <iostream>
// 通用模板定义
template <typename T>
class MyClass {
public:
void display() {
std::cout << "Generic template" << std::endl;
}
};
// 全特化版本
template <>
class MyClass<int> {
public:
void display() {
std::cout << "Specialized template for int" << std::endl;
}
};
int main() {
MyClass<double> obj1;
obj1.display(); // 输出:Generic template
MyClass<int> obj2;
obj2.display(); // 输出:Specialized template for int
return 0;
}
在这个示例中,MyClass<int>
是 MyClass
类模板的全特化版本,当模板参数为 int
时,使用特化版本。
函数模板全特化
函数模板也可以进行全特化:
#include <iostream>
// 通用函数模板
template <typename T>
void myFunction(T value) {
std::cout << "Generic template: " << value << std::endl;
}
// 全特化版本
template <>
void myFunction(int value) {
std::cout << "Specialized template for int: " << value << std::endl;
}
int main() {
myFunction(3.14); // 输出:Generic template: 3.14
myFunction(42); // 输出:Specialized template for int: 42
return 0;
}
模板偏特化
模板偏特化是指为一组模板参数提供专门的实现,而不是针对单个特定的参数。偏特化允许更细粒度的控制和更广泛的特化。
类模板偏特化
以下是一个类模板偏特化的示例:
#include <iostream>
// 通用模板定义
template <typename T, typename U>
class MyClass {
public:
void display() {
std::cout << "Generic template" << std::endl;
}
};
// 偏特化版本
template <typename T>
class MyClass<T, int> {
public:
void display() {
std::cout << "Partial specialization with int" << std::endl;
}
};
int main() {
MyClass<double, double> obj1;
obj1.display(); // 输出:Generic template
MyClass<double, int> obj2;
obj2.display(); // 输出:Partial specialization with int
return 0;
}
在这个示例中,当模板的第二个参数为 int
时,使用偏特化版本。
偏特化不能用于函数模板
需要注意的是,函数模板不支持偏特化,因为编译器无法区分不同的偏特化版本。在这种情况下,可以使用函数重载来实现类似的效果。
示例:指针特化
偏特化可以用于指针类型的特化,以下是一个例子:
#include <iostream>
// 通用模板定义
template <typename T>
class MyClass {
public:
void display() {
std::cout << "Generic template" << std::endl;
}
};
// 偏特化版本:指针类型
template <typename T>
class MyClass<T*> {
public:
void display() {
std::cout << "Partial specialization for pointers" << std::endl;
}
};
int main() {
MyClass<int> obj1;
obj1.display(); // 输出:Generic template
MyClass<int*> obj2;
obj2.display(); // 输出:Partial specialization for pointers
return 0;
}
总结
- 全特化:为特定类型提供完全特化的实现,适用于类模板和函数模板。
- 偏特化:为一组类型模式提供特化的实现,仅适用于类模板,不适用于函数模板。