У меня небольшая проблема. У меня есть класс 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;
// *****************
(надеюсь, мои имена переменных не требуют пояснений)
Я думаю, что мои прототипы верны, но я просто не могу найти способ сделать это.
Спасибо!