Внедрение других операторов сравнения в терминах оператора <в один вызов

Я видел это, если у вас 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)

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