Перегрузка операторов присваивания в прокси-классе для матрицы и вектора? - PullRequest
0 голосов
/ 13 ноября 2018

У меня небольшая проблема. У меня есть класс Matrix, определенный следующим образом (в мажорной строке):

template<typename T>
class Matrix {
    // must be inline
    friend std::ostream &operator<<(std::ostream &lhs, const Matrix &rhs) {
        std::size_t maxlen;
        std::max_element(rhs._data.begin(), rhs._data.end(),
            [&maxlen](auto &a1, auto &a2) {
                std::ostringstream temp;
                temp << a1; 
                std::size_t len1 = temp.str().size();
                temp.str("");
                temp << a2; 
                maxlen = (len1 < (temp.str().size()) ? temp.str().size() : len1);
                return (len1 < (temp.str().size()));
             });
        for (std::size_t i = 0; i < rhs._m; i++) {
            for (std::size_t j = 0; j < rhs._n; j++)
                lhs << std::setw(maxlen) << rhs[i][j] << ' ';
            lhs << std::endl;
        }
        return lhs;
    }   

    private:
        class RowVector {
            private:
                T *_vec;
                std::size_t _l; 

            public:
                RowVector(T *vec, std::size_t l); 

                const T &operator[](std::size_t index) const;
                T &operator[](std::size_t index);

                operator std::vector<T>() const;
        };

        std::vector<T> _data;
        std::size_t _m; 
        std::size_t _n; 

    public:
        Matrix(std::size_t m, size_t n, const T &elem = T());

        const RowVector operator[](std::size_t index) const;
        RowVector operator[](std::size_t index);

        std::size_t getm() const;
        std::size_t getn() const;
        void fill(const T &elem);
        void fillRow(std::size_t index, const T &elem);
        void fillCol(std::size_t index, const T &elem);

        Matrix &transpose(unsigned int i = 1);

        const std::vector<T> &data() const;
};

и хотите перегрузить два оператора RowVector =

typename Matrix<T>::RowVector &operator=(const std::vector<T> &vec);
typename Matrix<T>::RowVector &operator=(const Matrix<T> &mat);

, поэтому я могу вернуть RowVector &, используя A [0], и переназначить его значение, используя вектор или матрицу. Имейте в виду, что я (предположительно) могу игнорировать правило трех, потому что я не предоставляю клиенту явного способа создания RowVector объекта.

Однако, пытаясь написать тела функций для перегрузок, я столкнулся с проблемой:

(1) Я не могу скопировать-построить объект Vector / Matrix, который будет сохраняться вне области действия оператора =, так что я могу назначить его data() на _vec и его size() на _l.

(2) Я не могу напрямую изменить _data, так как это не статическая переменная; даже если бы я мог, у меня нет способа обнаружить индекс, чтобы я мог перезаписать соответствующую область памяти в окружающем объекте Matrix.

Знаете ли вы, каким образом это можно сделать? Это были бы два очень полезных актива для моего класса.

Редактировать: Чтобы было яснее, я бы хотел написать что-то вроде этого:

Matrix<int> A(3, 4);
std::vector<int> v {1, 2, 3, 4};
Matrix<int> row(1, 4, 3);
// *****************
A[0] = v;
A[1] = row;
// *****************

(надеюсь, мои имена переменных не требуют пояснений) Я думаю, что мои прототипы верны, но я просто не могу найти способ сделать это.

Спасибо!

...