2016-10-24 23 views
5

Tôi đang khám phá ra C++ và tôi muốn tạo một ma trận ma trận toán học mini bằng cách sử dụng các mẫu.Mẫu toán tử quá tải C++ với các đối số khác nhau

Ở đây, tôi muốn quá tải toán tử *.

Nếu tôi mô tả một ma trận như thế này: M(y, x) với M tên ma trận, yx chiều cao và chiều rộng, một phép nhân ma trận nên xem xét như thế:

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

Hiện nay tôi có mã này:

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; 
}; 

Vì vậy, tôi muốn để có thể nhân hai differents ma trận như thế:

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

// fill the matrix with values 

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

Tôi đã tìm kiếm nhưng tôi không tìm thấy câu trả lời cho câu hỏi này (có thể vì tôi không thực sự biết những gì tôi phải tìm kiếm chính xác).

Nhờ sự giúp đỡ của bạn :)

Trả lời

3

Bạn cần phải thực hiện của bạn operator* một hàm thành viên mẫu, một cái gì đó giống như vậy:

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

Chú ý rằng kiểu trả về là không còn là một tài liệu tham khảo, như operator* sẽ trả về giá trị mới - nếu bạn muốn, bạn có thể xác định một bổ sung operator*= để sửa đổi ma trận LHS tại chỗ. Một điều cần lưu ý là phép nhân ma trận chỉ có ý nghĩa nếu kích thước của ma trận đồng ý: có nghĩa là, nếu số cột trong LHS khớp với số hàng trong RHS. Để thực hiện điều này, bạn có thể sử dụng một static_assert trong hàm thành viên của bạn để đảm bảo rằng các thông số mẫu đồng ý:

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

này khá đơn giản, xác định operator* như một hàm template. Ví dụ mẫu chức năng miễn phí:

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; 
} 

Xin lưu ý rằng operator* trả về theo giá trị. điều này đặc biệt quan trọng vì bạn trả về một kiểu khác và không có đối tượng để trả về một tham chiếu đến (tính chính xác thành ngữ sang một bên).

Các vấn đề liên quan