Сегодня я реализовал тип данных, в котором я решил перегрузить операторы сравнения. При этом вопрос возник в моей голове.
Почему я, как программист, должен определять каждый оператор сравнения, когда все, что я делаю, это определяю их в терминах '<'
(увидеть ниже)? — То есть, почему компилятор не генерирует их автоматически для меня.
a == b => !(a<b || b<a)
a != b => (a<b || b<a)
a > b => b < a
a >= b => !(a < b)
a <= b => !(b < a)
Я понимаю, что по соображениям производительности вполне разумно хотеть реализовать больше, чем просто '<'
,
Я знаю, что очевидный ответ заключается в том, что это потому, что я легко могу сделать это сам, но я верю, что спецификации компиляторов / языка должны делать все возможное, чтобы облегчить использование языка.
определять operator<()
а также operator==()
, а также
#include <utility>
using namespace std::rel_ops;
Тогда все операторы сравнения определяются автоматически.
Смотрите пример, предоставленный cppreference.com
Прочитать о std::rel_ops
, Никто не использует это.
Ты можешь использовать повышение :: операторов. Он делает именно то, что вы хотите, и многое другое.