Я реализовал матричный класс Matrix<T,Rows,Cols>
и соответствующую специализацию Transposed<Matrix<T,Rows,Cols>>
, которую можно обобщить следующим образом:
template<typename T, Integer TransposedRows, Integer TransposedCols>
class Transposed<Matrix<T,TransposedRows,TransposedCols>>:
public Matrix<T,TransposedRows,TransposedCols>
{
public:
constexpr Transposed(const Matrix<T,TransposedRows,TransposedCols>& mat):
mat_ptr_(std::make_shared<Matrix<T,TransposedRows,TransposedCols>>(mat))
{}
inline constexpr const auto& operator()() const
{
return *mat_ptr_;
}
inline constexpr void operator()(cons Matrix<T,TransposedRows,TransposedCols>& mat)
{
mat_ptr_=std::make_shared<Matrix<T,TransposedRows,TransposedCols>>(mat);
}
inline constexpr T &operator()(const Integer& i, const Integer& j)
{
assert(i < Rows);
assert(j < Cols);
return (*mat_ptr_)(j,i);
}
inline constexpr const T &operator()(const Integer i, const Integer j) const
{
assert(i < Rows);
assert(j < Cols);
return (*mat_ptr_)(j,i);
}
private:
std::shared_ptr<Matrix<T,TransposedRows,TransposedCols,NonZeroRow>> mat_ptr_;
}
Передав указатель, я должен избегать копирования всех элементов иЯ могу просто использовать транспонированный матричный объект естественно. К сожалению, таким образом, структура этого класса отличается от исходной, в которой массив является сборщиком матричных элементов.
Поскольку я реализовал различные операции (+, -, *, /)класса матрицы, я хотел бы распространить их также на транспонированной специализации матрицы. Есть ли разумный способ сделать это без чрезмерного дублирования кода?