上一篇介绍了c++类模板, 这一篇将介绍一下c++模板的全特化与偏特化
首先,模板特化是指为模板定义的特定参数类型提供定制的实现。模板特化可以分为两种类型:全特化和偏特化。
1、全特化:
- 全特化是指对模板的所有模板参数进行具体化,为特定的参数列表提供特定的实现。
- 在全特化中,对于给定的类型,会提供一个完全定制的实现。
1.1、类模板的全特化:
#include <iostream>
// 定义一个类模板
template<typename T>
class MyTemplate {
public:
void print() {
std::cout << "General Template" << std::endl;
}
};
// 类模板的全特化
template<>
class MyTemplate<int> {
public:
void print() {
std::cout << "Specialized Template for int" << std::endl;
}
};
int main() {
MyTemplate<double> obj1;
obj1.print(); // 输出:General Template
MyTemplate<int> obj2;
obj2.print(); // 输出:Specialized Template for int
return 0;
}
在全特化中,对于给定的类型,会提供一个完全定制的实现。
1.2、函数模板的全特化:
函数模板的全特化是指为特定的参数列表提供特定的实现。
#include <iostream>
// 函数模板的通用实现
template<typename T>
void print() {
std::cout << "General Template" << std::endl;
}
// 函数模板的全特化(特例化为int类型)
template<>
void print<int>() {
std::cout << "Specialized Template for int" << std::endl;
}
int main() {
print<double>(); // 输出:General Template
print<int>(); // 输出:Specialized Template for int
return 0;
}
2. 偏特化:
- 偏特化是指对模板的部分参数进行特化,而不是全部参数。
- 偏特化允许在模板中对一部分模板参数进行特定化,而另一部分保持参数化状态。
- 偏特化通常用于当模板参数满足某种条件时提供不同的实现。
2.1、类模板的偏特化:
#include <iostream>
// 定义一个类模板
template<typename T1, typename T2>
class MyTemplate {
public:
void print() {
std::cout << "General Template" << std::endl;
}
};
// 类模板的偏特化(特例化第二个参数为int)
template<typename T>
class MyTemplate<double, T> {
public:
void print() {
std::cout << "Partial Specialization for double, T" << std::endl;
}
};
int main() {
MyTemplate<double, int> obj1;
obj1.print(); // 输出:Partial Specialization for double, T
MyTemplate<int, double> obj2;
obj2.print(); // 输出:General Template
return 0;
}
2.2、 函数模板的偏特化
#include <iostream>
// 函数模板的通用实现
template<typename T1, typename T2>
void print() {
std::cout << "General Template" << std::endl;
}
// 函数模板的偏特化(特例化第二个参数为int类型)
template<typename T>
void print<double, T>() {
std::cout << "Partial Specialization for double, T" << std::endl;
}
int main() {
print<double, int>(); // 输出:Partial Specialization for double, T
print<int, double>(); // 输出:General Template
return 0;
}