Какой минимальный набор операторов мне нужен для перегрузки? - PullRequest
0 голосов
/ 04 января 2011

Какие операторы сравнения (<=,>, == и т. Д.) Вы обычно используете в качестве базовых операторов, которые Вы можете после использования использовать для реализации остальных операторов сравнения или для всех возможных сравнений между классами?

Ответы [ 3 ]

7 голосов
/ 04 января 2011

Вы можете реализовать все шесть операторов в терминах == и <, используя следующие эквивалентности:

a != b    =>    !(a == b)
a > b     =>    b < a
a >= b    =>    !(a < b)
a <= b    =>    !(b < a)
3 голосов
/ 04 января 2011

Я обычно реализую operator== для объектов, а также operator!=. Многие объекты не имеют последовательности упорядочения, поэтому операторы сравнения <, <=,>,> = не имеют смысла.

Кроме того, с использованием boost::equality_comparable и boost::less_than_comparable необходимо только operator== и operator<. Их можно найти в boost/operators.hpp.

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

Операторы сравнения должны быть реализованы по мере необходимости в классах. Многие занятия не нуждаются в них. Также остерегайтесь их реализации или определения в базовых классах без учета последствий наследования.

2 голосов
/ 04 января 2011

Для классов, где они применимы, я обычно реализую operator< и operator== "изначально" из-за их значимости в стандартных алгоритмах и контейнерах.

Затем я реализую остальные четыре в терминах этих.1005 *

Другой подход, который я иногда рассматриваю, заключается в реализации функции сравнения, которая возвращает 1, 0 или -1 в стиле strcmp, и реализует все другие операторы в терминах этого,Я делаю это только в том случае, если operator< и operator== выглядят так, как будто им нужно использовать большую часть одного и того же кода, что, как мне кажется, происходит реже, чем я думаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...