Быстрый и грязный оператор! =
-
22-07-2019 - |
Вопрос
В своих классах я часто пишу быстрый operator!=
, возвращая !(*this == rhs)
, например:
class Foo
{
private:
int n_;
std::string str_;
public:
...
bool operator==(const Foo& rhs) const
{
return n_ == rhs.n_ && str_ == rhs.str_;
}
bool operator!=(const Foo& rhs) const
{
return !(*this == rhs);
}
};
Я не вижу никаких очевидных проблем с этим, но подумал, что я спрошу, если кто-нибудь знает о них.
Решение
Я полагаю, что это предпочтительный метод реализации operator!=
, чтобы вы не повторялись и у вас были гарантированные правильные отношения с operator==
.
Другие советы
Определить operator!=
как !operator==
- это хорошо
Для облегчения определения этих тривиальных эквивалентных операторов я всегда использую Boost.Operators .
Случай только с operator==
и operator+
(т. е. с использованием равенство_компараблей < > ) не сильно выигрывает.
Но когда вам нужно меньше и больше, чем слишком, или какая-то комбинация operator*
, <=> и т. д., это становится очень удобным.
Пример для вашего случая будет читать
class Foo : private boost::equality_comparable< Foo >
{
private:
int n_;
std::string str_;
public:
...
bool operator==(const Foo& rhs) const
{
return n_ == rhs.n_ && str_ == rhs.str_;
}
};
Нет, это абсолютно нормально - я делаю то же самое.