Как обращаться с матричными и транспонированными <matrix>типами единообразно в c ++? - PullRequest
0 голосов
/ 11 октября 2019

Я реализовал матричный класс 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_;
    }

Передав указатель, я должен избегать копирования всех элементов иЯ могу просто использовать транспонированный матричный объект естественно. К сожалению, таким образом, структура этого класса отличается от исходной, в которой массив является сборщиком матричных элементов.

Поскольку я реализовал различные операции (+, -, *, /)класса матрицы, я хотел бы распространить их также на транспонированной специализации матрицы. Есть ли разумный способ сделать это без чрезмерного дублирования кода?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...