2016-10-24 12 views
5

私はC++を発見しており、テンプレートを使用してミニ数学行列ライブラリを作成したいと考えています。異なる引数を持つC++演算子オーバーロードテンプレート

ここでは、演算子*をオーバーロードします。 MM(y, x)行列名、yx高さと幅は、行列の乗算は、そのようになります。:私はこのような行列を記述する場合

M(a, b) * N(b, c) = R(a, c) 

は現在、私はこのコードを持っている:

template<unsigned int y, unsigned int x> 
class Matrix 
{ 
public: 
    Matrix() { } 
    ~Matrix() { } 

    Matrix<y, x2>& operator*(const Matrix<y2, x2>& right) 
    { 
     // code... 
    } 
private: 
    std::array<std::array<double, x>, y> m_values; 
}; 

だから私はそのような2貴様行列を乗算できるようにしたいと思います:

Matrix<3, 4> m; 
Matrix<4, 2> n; 

// fill the matrix with values 

Matrix<3, 2> o = m * n; 

私は検索しましたが、この質問に対する回答が見つかりませんでした(正確に何を検索する必要があるかわからないためかもしれません)。あなたの助けのための

感謝:)

答えて

3

あなたのoperator*テンプレートメンバ関数を行う必要があり、そのような何か:戻り値の型がもはや参照であること

template <unsigned int y2, unsigned int x2> 
Matrix<y, x2> operator*(const Matrix<y2, x2>& right) 
{ 
    // code... 
} 

お知らせ、などoperator*は新しい値を返す必要があります。好きな場合は、LHSマトリックスをインプレースで変更する補完的なoperator*=を定義することができます。

注目すべきもう1つのことは、行列乗算は、行列の次元が一致する場合、つまり、LHSの列の数がRHSの行の数と一致する場合にのみ意味があるということです。 、

template <unsigned int y2, unsigned int x2> 
Matrix<y, x2> operator*(const Matrix<y2, x2>& right) 
{ 
    static_assert(y2 == x, "Matrix dimensions mismatched"); 
    // code... 
} 
0

これはかなり単純な関数テンプレートとしてoperator*を定義します。これを適用するには、テンプレートパラメータが一致することを確認するために、メンバ関数内static_assertを使用することができます。フリー関数テンプレートの例:

template<unsigned y1, unsigned x1, unsigned y2, unsigned x2> 
Matrix<y1, x2> operator*(Matrix<y1, x1> const& l, Matrix<y2, x2> const& r) 
{ 
    // static_assert(x1 == y2, "Matrices cannot be multiplied"); 
    Matrix<y1, x2> ret{}; 
    // multiply 
    return ret; 
} 

operator*は値で戻ります。これは特に重要です。なぜなら、異なる型を返し、オブジェクトを持たずに(慣用的な正しさは脇に)参照を返すからです。

関連する問題