Правильный способ реализации перегрузки операторов для арифметики смешанного режима c в C ++ - PullRequest
0 голосов
/ 01 апреля 2020

Допустим, у меня есть некоторый пользовательский тип T, который, как ожидается, будет поддерживать арифметику смешанного режима c, такую ​​как T + 2, 15 + T и T + T.

Я могу определить operator + принимать операнды разных типов:

T operator+(T a, T b) {
    return a += b;  // assume that operator += is implemented as a member function of T
}

T operator+(T a, int b) {
    // implementation
}

T operator+(int a, T b) {
    // implementation
}

В случае, если ожидается, что тип T будет поддерживать арифметические операции c со многими другими типами (int, double, string et c.) число комбинаций T и эти типы и их позиции (T, строка / строка, T) будут довольно высокими.

Мой вопрос заключается в том, существует ли более элегантный способ перегрузки операторов для уменьшения количества таких комбинаций.

1 Ответ

1 голос
/ 01 апреля 2020

Это зависит от вашего варианта использования.

Много раз вы можете с легкостью написать конструктор для

T(int i) {
    //construct T from int
};

и не пометить его как явный. Теперь вы можете выполнять T + 2, 15 + T и T + T, просто определяя

T operator+(T a, T b)

, поскольку неявное преобразование пойдет на конвертацию вашего int в T. Если вам нужно много различных арифметических c типов, вы можете много раз избежать создания одного шаблона.

template <typename U, std::enable_if_t<std::is_arithmetic_v<U>, int> = 0>
T(U u) {
    //construct T from arithmetic type
};

Теперь тот же operator+ позаботится обо всех встроенных числах.

Другим вариантом может быть предоставление T оператора преобразования для int, но, поскольку вы спрашиваете о operator+, который возвращает T, я пропущу этот пример. Принцип тот же, но вы получите int с после добавления.

Если ваш T очень сложный, иногда вам просто нужно дать ему много различных перегрузок операторов.

...