Оператор сравнения на равенство в реализации шаблонных классов С++
Где-то уже даже и не помню упоминалось, что лучше делать перегрузку сравнение оператора == для шаблонных классов, с помощью следующего действия:
bool operator == (l, r) {
return !(l > r || r > l);
}
Как с точки логики в реализации это может быть полезно?
Ответы (1 шт):
Это не самое хорошее решение.
В общем случае == != могут быть быстрее, чем < <= > >=. Например, для 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();}.