Вопрос

В своих классах я часто пишу быстрый 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_;
   }

};

Нет, это абсолютно нормально - я делаю то же самое.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top