Как я могу перегрузить & lt; & lt; оператор

Я должен создать класс Matrix, и у меня возникла проблема с перегрузкой операторов

Я хотел бы заполнить матрицы, используя << оператор

Matrix<double> u3(2,2);

u3 << 3.3, 4, 3, 6;template<class T>
Matrix<T> Matrix<T>::operator <<(T in){
//Fill up the matrix, m[0] = 3.3, m[1]=4...
return *this;
}

Как перегрузить этот оператор?

1

Решение

Вот подход с использованием запятых:

#include <iostream>
using namespace std;

struct Matrix {

struct Adder {
Matrix& m;
int index;

Adder(Matrix& m) : m(m), index(1) {}

Adder& operator,(float value) {
m.set(index++, value);
return *this;
}
};

void set(int index, float value) {
// Assign value to position `index` here.
// I'm just printing stuff to show you what would happen...
cout << "Matrix[" << index << "] = " << value << endl;
}

Adder operator<<(float value) {
set(0, value);
return Adder(*this);
}

};

Демо-версия: http://ideone.com/W75LaH

Некоторые объяснения:

Синтаксис matrix << 5, 10, 15, 20 достигается в два этапа:

  • matrix << 5 оценивается первым; он устанавливает первый элемент на 5 и возвращает временный Adder объект, который обрабатывает дальнейшие вставки (помня индекс для следующей вставки)
  • Adder перегружен operator, который выполняет следующие вставки после каждой запятой.
3

Другие решения

Такой подход будет работать:

#include <iostream>template <typename T>
class Mat {
public:
T val;
};

template <typename T>
Mat<T>& operator<<(Mat<T>& v, T in) {
std::cout << in << " ";
return v;
}

int main() {
Mat<int> m;
m << 1 << 2 << 3;
}

Обратите внимание, что я использую бесплатный operator<< функция, и не используйте запятые между значениями.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector