最終的には行列式を求めることや、余因子行列や逆行列を求める関数も作成したい。
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 件のコメント :
コメントを投稿