目录
非类型模板参数
模板参数可分为类型形参和非类型形参。
类型形参: 出现在模板参数列表中,跟在class或typename关键字之后的参数类型名称。
非类型形参: 用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用。
例如,我们要实现一个静态数组的类,就需要用到非类型模板参数。
#include <iostream>
template <class T, std::size_t N>
class StaticArray {
public:
// 获取数组大小
constexpr std::size_t arraysize() const {
return N;
}
// 获取数组中的元素(带边界检查)
T& operator[](std::size_t index) {
if (index >= N) {
throw std::out_of_range("Index out of range");
}
return _array[index];
}
// 获取数组中的元素(常量版本,带边界检查)
const T& operator[](std::size_t index) const {
if (index >= N) {
throw std::out_of_range("Index out of range");
}
return _array[index];
}
// 填充数组中的所有元素
void fill(const T& value) {
for (std::size_t i = 0; i < N; ++i) {
_array[i] = value;
}
}
// 打印数组内容
void print() const {
for (std::size_t i = 0; i < N; ++i) {
std::cout << _array[i] << " ";
}
std::cout << std::endl;
}
private:
T _array[N]; // 利用非类型模板参数指定静态数组的大小
};
int main() {
StaticArray<int, 5> arr;
// 填充数组
arr.fill(10);
// 打印数组内容
arr.print();
// 访问和修改数组元素
arr[2] = 20;
arr.print();
// 获取数组大小
std::cout << "Array size: " << arr.arraysize() << std::endl;
// 尝试访问越界元素
try {
std::cout << arr[5] << std::endl; // 这将抛出异常
} catch (const std::out_of_range& e) {
std::cerr << e.what() << std::endl;
}
return 0;
}
-
模板声明:
template <class T, std::size_t N>
:这个类模板接受两个参数:一个类型参数T
和一个非类型模板参数N
,表示数组的大小。
-
成员函数:
constexpr std::size_t arraysize() const
:返回数组的大小,使用constexpr
保证在编译时常量。T& operator[](std::size_t index)
和const T& operator[](std::size_t index) const
:重载的索引运算符用于访问数组元素,包含边界检查以防止越界访问。void fill(const T& value)
:填充数组的所有元素为指定的值。void print() const
:打印数组内容。
-
数据成员:
T _array[N]
:声明一个静态数组作为类的成员,大小为模板参数N
。
-
main函数:
- 创建一个
StaticArray<int, 5>
对象。 - 使用
fill
方法填充数组,打印数组内容。 - 修改数组元素并打印内容。
- 获取并打印数组大小。
- 尝试访问越界元素,捕获并处理异常。
- 创建一个