私のマトリックスクラスでは、次のことを行いました。
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 引数に対して、長いテンプレート宣言を書き出す必要があります。また、ベクトルのサイズ変更/プッシュバックを削除する方法がわからなかったので、ユーザーがベクトルにインデックスを付けたときにサイズを変更できないため、配列を使用しました。
1D 配列を使用してインデックスを作成しようとしましたが (I * Width + J)、[][] 演算子が失われます。
ベクトルのベクトルを使うのは悪いことですか? クラスを改善し、RAII 準拠を維持するためのアイデアはありますか? valarray の使用方法がよくわかりません。上記は維持するのが面倒です。どんなアイデアでも大歓迎です。