Оператор сравнения на равенство в реализации шаблонных классов С++

Где-то уже даже и не помню упоминалось, что лучше делать перегрузку сравнение оператора == для шаблонных классов, с помощью следующего действия:

bool operator == (l, r) {
  return !(l > r || r > l);
}

Как с точки логики в реализации это может быть полезно?


Ответы (1 шт):

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

Это не самое хорошее решение.

В общем случае == != могут быть быстрее, чем < <= > >=. Например, для std::string, == != могут сначала сравнить размер, и не проверять содержимое строки, если размер разный. А < и остальные операторы так сделать не могут.

Так что не получится нормально реализовать все через один оператор (< или даже <=>), нужно как минимум два осмысленных оператора: в C++20 это == и <=> (остальные сгенерируются сами), а до C++20 это == и < (!= реализовать через ==, остальные четыре через <).

Если даже два оператора писать неохота, а сравнение нужно лексикографическое по списку полей, то сделать функцию а-ля auto tie() const {return std::tie(a, b, c);}, а дальше реализовывать операторы в духе friend bool operator==(const A &x, const A &y) {return a.tie() == b.tie();}.

→ Ссылка