2016-10-24 3 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; 
}; 

그래서 그런 매트릭스는 서로 다른 두 가지를 곱 수 있도록하고 싶습니다 :

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*=을 정의 할 수 있습니다.

주의해야 할 또 한가지는 행렬 곱셈은 행렬의 차원이 일치하는 경우에만 의미가 있습니다. 즉, 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; 
} 

값에 의해 반환됩니다. 이것은 다른 유형을 반환하고 참조를 반환 할 객체가 없기 때문에 (특히 관용적 인 정확성을 제외하고) 특히 중요합니다.