C++ 模板进阶:非类型参数与特化详解
1. 非类型模板参数
模板参数主要分为两类:类型模板参数和非类型模板参数。类型参数如 typename T 接收的是'类型',而非类型参数则接收具体的'常量值'。
例如在 template <int N> 中,N 就是一个非类型模板参数。它必须在编译期就能确定结果,且不能是浮点数、类对象或字符串。
// 模板参数 <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. 类模板的特化
模板特化(Template Specialization)允许我们为特定条件定义专门的实现,而不使用通用模板的代码。
2.1 函数模板特化
当模板参数满足特定条件时,可以定义特化版本。编译器会优先匹配特化版本。
#include <iostream>
// 通用模板(适用于大多数类型)
template <typename T>
void Print {
std::cout << << value << std::endl;
}
<>
<>( value) {
std::cout << << value << << ()value << std::endl;
}
{
();
();
;
}


