2016年4月7日木曜日

C++14による正方行列クラスの作成(その1)

C++11,14の機能を使って、正方行列のクラスを定義してみようと思う。
最終的には行列式を求めることや、余因子行列や逆行列を求める関数も作成したい。
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 件のコメント :

コメントを投稿