Перегрузка шаблонной функции C++
Я работаю над общим классом матрицы. Я перегрузить функцию +, чтобы когда это сделать:
- матрица = скаляр * матрица
- матрица = матрица * скаляр
- матрица = матрица * матрица
Попытка сделать это так (перегрузка функции): это правильный способ сделать это?
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*
позволять
- матрица = скаляр * матрица
- матрица = матрица * скаляр
- матрица = матрица * матрица
вам нужно определить эти три перегрузки операторов как функции в пространстве имен, окружающем класс матрицы:
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
альтернативным способом было бы использовать функциональные объекты и передавать их в класс матрицы, чтобы функциональные объекты могли обрабатывать особенности алгоритма... Это позволяет вам добавить еще несколько при необходимости.
Цепочка операторов также будет полезна в приведенном выше коде, следовательно, возврат по ссылке для перегруженных операторов.