Я пытаюсь реализовать класс Matrix с линейными алгебраическими операциями.Я хочу сделать класс доступным для нескольких типов значений, таких как uint
, uchar
, float
, double
.
. Заголовок выглядит следующим образом:
template<typename T>
class Matrix{
public:
Matrix(int width, int height);
Matrix(const Matrix<T> & other);
virtual ~Matrix();
unsigned int width() const { return width_; }
unsigned int height() const { return height_; };
T * data() const { return data_ptr_; };
private:
T * data_ptr_;
unsigned int width_;
unsigned int height_;
}
Исходный файл выглядит следующим образом.
template<typename T>
Matrix<T>::Matrix(int width, int height ): width_(width), height_(height)
{
data_ptr_ = new T[width * height];
}
template<typename T>
Matrix<T>::Matrix(const Matrix<T> & other): Matrix(other.width(), other.height() )
{
memcpy(data_ptr_, other.data(), width_ * height_ * sizeof(T);
}
template<typename T>
Matrix<T>::~Matrix()
{
delete []data_ptr_;
}
template class Matrix<double>;
template class Matrix<float>;
...
Теперь я хочу определить operator +
, который будет возвращать Matrix
типа, который обычное преобразование c ++ делает при добавлении двух значений, то есть
Matrix<double> + Matrix<float> => Matrix<double>
Matrix<int> + Matrix<float> => Matrix<float>
и я хочу сделать это без явных преобразований.Например,
Matrix<float> float_matrix(10,20);
Matrix<int> int_matrix(10,20);
auto sum_matrix = float_matrix + int_matrix;
, поэтому сумма должна иметь тип float
.
Однако я попробовал 2 метода, но безуспешно.
Метод 1 Определите operator +
как
//inside class definition
Matrix<T> operator+(const Matrix<T> &other) const;
и определите неявные конструкторы, такие как
//inside the class declaration
template<typename K>
Matrix(const Matrix<K> & other);
и создавать их только в очевидном иерархическом порядке: uchar-> uint->float->double
, однако мне все еще приходится вручную приводить операнды различных типов.
Метод 2
Определите operator +
как
//inside the class declaration
template<typename K, typename R>
Matrix<R> operator+(const Matrix<K> &other) const;
и напишите специализации для каждого случая, однако я не смог заставить компилятор правильно выводить аргументы шаблона.
Ни один из методов не кажетсячтобы быть правильным.
Кто-нибудь может указать мне направление?