最近项目中遇到一个需求,编写一个一维数组模板类和二维数组模板类让公司框架支持,要求拥有静态数组的大部分功能。
可能简短的几行代码并不能看出难在哪里,但是对我来说确实是为它的设计方法苦思冥想了一两天,此外还有公司大佬的帮助,也属于本人泛型编程的开篇,因此写下此文用于纪念。
下面直接上代码(一维数组类)
//头文件<array.h>
#pragma once
#include <cstddef>
#include <stdexcept>
template<typename T,size_t N>
class Array{
T arr[N];
public:
T& operator[](size_t index) {
if(index < 0||index >= N)
throw std::out_of_range("Array out of bounds");
return const_cast<T&>(arr[index]);//空指针需要模板特化
}
const T& operator[](size_t index) const {
if(index < 0||index >= N)
throw std::out_of_range("Array out of bounds");
return const_cast<T&>(arr[index]);
}
T* begin(){return arr;}
int size(){return N;}
};
二维数组类
//头文件<array2D.h>
#pragma once
#include <cstddef>
#include <stdexcept>
#include "Array.h"
template<typename T,size_t N1,size_t N2>
class Matrix
{
Array<T,N2> matrix[N1];
protected:
const T* it = matrix->begin();
public:
Array<T,N2>& operator[](int index)
{
if(index >= N1 ||index <0) throw std::out_of_range("Array out of bounds");
return const_cast<Array<T,N2>&>(matrix[index]);
}
T* begin()
{
return const_cast<T*>(it);
}
int size(){return sizeof(T)*N1*N2;}
int col(){return N1;}
int row(){return N2;}
};
这些模板类由于项目需求主要是为了供今后的开发人员使用,在一定程度上完善了一般的静态数组的部分功能,毕竟c++静态数组中越界并不会抛出异常,这个类提供了异常处理。
此外或许重载 << 运算符等等之类的暂时还没有需求,以后或许相继会完善一些类的内容,毕竟功能随着需求增加,上述只是简单功能的实现。
主要用到的点如下
1.利用begin()返回数组的指针,使得数组可以通过解引用索引数组值。
2.重载中括号,让类可以像数组一样用[]索引。
3.利用一维数组建立二维数组,双中括号索引由两个数组配合完成
因项目需要,今后也离不开泛型编程,刚刚新手上路,技术尚且不足,若是有什么建议或者什么书推荐欢迎提出一起讨论学习。