Как объединить несколько операторов класса со схожей логикой, но разными операторами в один
Возможно ли объединить несколько операторов класса со схожей логикой, но разными операторами в один, чтобы было меньше копипаста. Например, есть операторы +=, '-=`:
class Matrix {
public:
Functor& operator+=(const Functor& rhs) {
for (int i = 0; i < num; ++i) {
v[i][j] += rhs.v[i][j];
}
return *this;
}
Functor& operator-=(const Functor& rhs) {
for (int i = 0; i < num; ++i) {
v[i][j] -= rhs.v[i][j];
}
return *this;
}
private:
int rows_ {};
int columns_ {};
std::vector<std::vector<double>> matrix_;
};
Можно ли сделать в c++ что то типа:
Functor& operator(+=, -=)(const Functor& rhs) {
for (int i = 0; i < num; ++i) {
v[i][j] (+=, -=) rhs.v[i][j];
}
return *this;
}
Ответы (1 шт):
Нет, операторы для C++ схожи с функциями, то есть каждый оператор определяет только своё действие. Тем более в таком случае, когда оператор выполняют противоположные действия, как у вас. Дальше плохой совет: Если бы у вас был скалярный тип, то внутри оператора -= можно было бы вызывать оператор += с отрицательными значениями.
Но в сторону уменьшения количества написания кода при перегрузке операторов был сделан шаг в C++20, там было добавлен оператор <=> (spaceship operator), который позволяет создать перегрузки операторов сравнения.
К ответу добавлю заметку к коду: очень странно, что вы используете переменную num как размер (которая даже не является членом класса), хотя у вас вектора и вы можете пользоваться методом size() у этих векторов.