最終的には行列式を求めることや、余因子行列や逆行列を求める関数も作成したい。
constexprは使わないことにし、pImpl実装もムーブの処理が複雑になるため、とりあえず扱わないことにする。 今回は出力のための挿入演算子を定義してみる。
// matrix.cpp #include <iostream> template <typename T, int N> class Matrix { static_assert(N > 0, ""); public: //------------------------------------------ // // 挿入演算子 // //------------------------------------------ friend std::ostream& operator <<(std::ostream& os, const Matrix& x) { os << "["; for (int iRow = 0; iRow < N; iRow++) { os << "["; for (int iColumn = 0; iColumn < N; iColumn++) { os << x.elements_[iRow][iColumn]; if (iColumn != N - 1) os << ","; } os << "]"; if (iRow != N - 1) os << ","; } os << "]"; return os; } protected: T elements_[N][N] = {}; }; // class Matrix int main() { Matrix<int, 3> x; std::cout << x << std::endl; return 0; }
これを
g++ -std=c++14 matrix.cpp
のようにコンパイルすると、実行結果は
[[0,0,0],[0,0,0],[0,0,0]]
のようになる。
static_assertにより、Nが正かどうかをコンパイル時に確認する。
作成した行列クラスはクラステンプレートなので、挿入演算子(operator<<)は friend関数の生成イディオムを使うと定義しやすい。
また、C++11以降であれば、メンバ変数を elements_[N][N] = {} として初期化できる。
次回は、コンストラクタ、デストラクタ、そしてコピーとムーブのコンストラクタと代入演算子を定義してみたい。
0 件のコメント :
コメントを投稿