对于我的矩阵类,我做了:
template<typename T, std::uint32_t Height, std::uint32_t Width>
class Matrix
{
private:
std::array<std::array<T, Width>, Height> Elements;
static_assert(std::is_arithmetic<T>::value, "Argument T must be of arithmetic type.");
public:
Matrix();
Matrix(T* Data);
Matrix(T** Data);
Matrix(T Data[Height][Width]);
Matrix(const std::array<std::array<T, Width>, Height> &Data);
inline int size() {return Width * Height;}
inline const int size() const {return Width * Height;}
inline int width() {return Width;}
inline const int width() const {return Width;}
inline int height() {return Height;}
inline const int height() const {return Height;}
std::array<T, Width>& operator[](int Index);
const std::array<T, Width>& operator[](int Index) const;
Matrix& operator = (const Matrix &M);
Matrix& operator + (const Matrix &M);
Matrix& operator - (const Matrix &M);
Matrix& operator * (const Matrix &M);
};
template<typename T, std::uint32_t Height, std::uint32_t Width>
Matrix<T, Height, Width>::Matrix() {std::memset(&Elements, 0, sizeof(T) * Width * Height);}
template<typename T, std::uint32_t Height, std::uint32_t Width>
Matrix<T, Height, Width>::Matrix(T* Data) {if (Data) std::memcpy(&Elements, Data, sizeof(T) * Width * Height);}
template<typename T, std::uint32_t Height, std::uint32_t Width>
Matrix<T, Height, Width>::Matrix(T** Data) {if (Data) std::memcpy(&Elements, &Data[0][0], sizeof(T) * Width * Height);}
template<typename T, std::uint32_t Height, std::uint32_t Width>
Matrix<T, Height, Width>::Matrix(T Data[Height][Width]) {std::memcpy(&Elements, &Data[0][0], sizeof(T) * Width * Height);}
template<typename T, std::uint32_t Height, std::uint32_t Width>
Matrix<T, Height, Width>::Matrix(const std::array<std::array<T, Width>, Height> &Data) {std::memcpy(&Elements, &Data[0][0], sizeof(T) * Width * Height);}
template<typename T, std::uint32_t Height, std::uint32_t Width>
std::array<T, Width>& Matrix<T, Height, Width>::operator[](int Index) {return Elements[Index];}
template<typename T, std::uint32_t Height, std::uint32_t Width>
const std::array<T, Width>& Matrix<T, Height, Width>::operator[](int Index) const {return Elements[Index];}
因为我在网上阅读了很多评论,说不要使用向量,而是使用数组或使用 std::valarray..
现在我问的原因是因为我想重写我的矩阵类,这样我就不必继续这样做了:Matrix<Type, Width, Height>
每次..我宁愿在构造函数中这样做一次,而不必输入它对于每个功能.. 如上所述。例如,我必须为每个函数和每个 Matrix 参数写出很长的模板声明。另外我不知道如何删除向量的调整大小/后推,以便当用户索引向量时,他们将无法调整它的大小,所以我使用了数组。
我打算使用一维数组并对其进行索引 (I * Width + J) 但后来我失去了我的 [][] 运算符。
使用向量的向量是不是很糟糕?有什么想法可以改善我的课程并使其符合 RAII 标准吗?我不太明白如何使用 valarray 并且上面的维护很烦人。任何想法表示赞赏。