Как объединить несколько операторов класса со схожей логикой, но разными операторами в один

Возможно ли объединить несколько операторов класса со схожей логикой, но разными операторами в один, чтобы было меньше копипаста. Например, есть операторы +=, '-=`:

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 шт):

Автор решения: V31R

Нет, операторы для C++ схожи с функциями, то есть каждый оператор определяет только своё действие. Тем более в таком случае, когда оператор выполняют противоположные действия, как у вас. Дальше плохой совет: Если бы у вас был скалярный тип, то внутри оператора -= можно было бы вызывать оператор += с отрицательными значениями.

Но в сторону уменьшения количества написания кода при перегрузке операторов был сделан шаг в C++20, там было добавлен оператор <=> (spaceship operator), который позволяет создать перегрузки операторов сравнения.

К ответу добавлю заметку к коду: очень странно, что вы используете переменную num как размер (которая даже не является членом класса), хотя у вас вектора и вы можете пользоваться методом size() у этих векторов.

→ Ссылка