1. 非类型模板参数
模板参数有两种,一种叫类型模板参数,一种叫做非类型模板参数。今天我们来讲讲非类型模板参数。
template <int N> 中的 int N 就是典型的非类型模板参数。这里的 int 是参数的类型,而 N 是参数名,它接收的是一个具体的常量值,而非像普通类型模板参数(如 template <typename T>)那样接收一个'类型'。
两者核心区别就是:
- 类型模板参数:传递'类型'(如
T = int) - 非类型模板参数:传递'常量值'(如
N = 10)
简单来说就是类型模板参数是改变类型,非类型模板参数改变的是类型后面的数。
注意:
- 浮点数、类对象以及字符串是不允许作为非类型模板参数的。
- 非类型的模板参数必须在编译期就能确认结果。
// 模板参数 <int N> 就是非类型参数(传递的是'值')
template <int N>
class FixedArray {
private:
int arr[N]; // 用 N 作为数组长度(编译时就确定了)
public:
// 打印数组长度
void printSize() {
std::cout << "数组长度是:" << N << std::endl;
}
};
int main() {
// 实例化时指定具体的'值'(非类型参数)
FixedArray<3> arr3; // N=3,创建一个长度为 3 的数组
FixedArray<5> arr5; // N=5,创建一个长度为 5 的数组
arr3.printSize(); // 输出:数组长度是:3
arr5.printSize(); // 输出:数组长度是:5
return 0;
}
2. 类模板的特化
2.1 函数模板特化
模板的特化(Template Specialization)是 C++ 中为模板提供'特殊处理'的机制。简单说就是:当模板的参数满足某种特定条件时,我们可以为它定义一套专门的实现,而不使用通用模板的代码。


