Перегрузка шаблонной функции C++

Я работаю над общим классом матрицы. Я перегрузить функцию +, чтобы когда это сделать:

  1. матрица = скаляр * матрица
  2. матрица = матрица * скаляр
  3. матрица = матрица * матрица

Попытка сделать это так (перегрузка функции): это правильный способ сделать это?

template<class T>
class Matrix
{
    std::vector< std::vector<T> > mat;
    size_t rows , cols;

public:
    Matrix(){}
    Matrix(const std::string){  }
    Matrix(const size_t r, const size_t c, const std::vector<T> v){ }
    Matrix(const Matrix& other);

    Matrix<T> operator=(const Matrix<T> &other)  {  }

    Matrix<T> operator+(const Matrix<T> &other) const{}

    friend Matrix<T> operator*(const T &mat, const Matrix<T> &scalar) { }

    friend Matrix<T> operator*(const Matrix<T> &mat, const T &scalar) { }

    friend Matrix<T> operator*(const Matrix<T> &mat, const Matrix<T> &other) {  }

Также я буду рад узнать, есть ли проблемы с моими заявлениями. Спасибо за любую помощь.

2 ответа

Решение

Если вы хотите перегрузить operator* позволять

  1. матрица = скаляр * матрица
  2. матрица = матрица * скаляр
  3. матрица = матрица * матрица

вам нужно определить эти три перегрузки операторов как функции в пространстве имен, окружающем класс матрицы:

class Matrix { ... };
Matrix operator*(Scalar const& s, Matrix const& m) { ... }
Matrix operator*(Matrix const& m, Scalar const& s) { ... }
Matrix operator*(Matrix const& m1, Matrix const& m2) { ... }

В вашем случае вы объявили операторов как friend функции внутри класса, который делает то же самое, потому что он фактически объявляет свободные функции и делает их friends, Это зависит от реализации, если friend на самом деле необходимо. Если нет, я бы вывел их за пределы класса для ясности, но имейте в виду, что вам понадобится template<typename T> затем. Что касается остальной части кода, нет ничего, что явно нарушено, но в любом случае это всего лишь отрывок из реального кода.

Посмотрев на вопрос, пришла альтернативная идея.

matrix = scalar * matrix
matrix = matrix * scalar
matrix = matrix * matrix

альтернативным способом было бы использовать функциональные объекты и передавать их в класс матрицы, чтобы функциональные объекты могли обрабатывать особенности алгоритма... Это позволяет вам добавить еще несколько при необходимости.

Цепочка операторов также будет полезна в приведенном выше коде, следовательно, возврат по ссылке для перегруженных операторов.

Другие вопросы по тегам