Внедрение других операторов сравнения в терминах оператора <в один вызов
Я видел это, если у вас operator<
, вы можете реализовать, скажем, operator>=
как !(a < b)
. Однако, когда я пошел в Комитет С++ в Бристоле, они сказали, что вы можете реализовать все операторы сравнения таким образом. В частности, при рассмотрении типов, которые имеют нетривиальные операторы сравнения (рассмотрим произвольно длинную строку, особенно если это Юникод), это можно сделать только с одним вызовом operator<
. Я не могу представить, как это можно сделать.
Как я могу реализовать operator>
и operator<=
только с одним вызовом operator<
и ни к другим операторам сравнения?
Ответы
Ответ 1
-
a > b == b < a
-
a <= b == !(b < a)
-
a >= b == !(a < b)
Можно даже реализовать равенство в терминах меньше (вид здесь злоупотребляет моим метасинтаксисом):
-
(a == b) == (!(a < b) && !(b < a))
-
(a != b) == (a < b || b < a)
Хотя я бы не предлагал делать это на практике, так как он требует двух сравнений и обычно может быть реализован более эффективно напрямую.