Шаг 79.
Библиотека STL.
Вспомогательные средства. Вспомогательные операторы сравнения

    На этом шаге мы рассмотрим некоторые операторы сравнения.

    Четыре шаблонные функции определяют операторы сравнения !=, >, <= и >= вызовом операторов == и <. Определения этих функций в заголовочном файле <utility> выглядят так:

namespace std {
  namespace rel_ops { 
    template <class T> 
    inline bool operator != (const T& x, const T& y) {
      return !(x == y); 
    }

    template <class T>
    inline bool operator> (const T& x, const T& y) { 
      return у < x;
    }

    template <class T>
    inline bool operator<= (const T& x, const T& y) { 
      return !(y < x);
    }

    template <dass T>
    inline bool operator>= (const T& x, const T& y) {
      return !(x < y);
    }
  }
}

    Чтобы использовать эти функции, достаточно определить операторы < и ==. При включении пространства имен std::rel_ops другие операторы сравнения определяются автоматически. Пример:

#indude <utility> 
class X {
  .    .    .    . 
  public:
    bool operator== (const X& x) const; 
    bool operator< (const X& x) const;
    .    .    .
};

void foo()
{
  using namespace std::rel_ops;  // Получение доступа к !=. > и т. д. 
  X x1, х2;
  if (x1 != х2) {
  .     .    .    .
  }
  if (x1 > х2) {
  .     .    .    .
  }
  .     .    .    .
}

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

using namespace std; // Операторы не переходят
                     // в глобальную область видимости.

    С другой стороны, программисту, желающему получить прямой доступ к операторам, достаточно выполнить следующую директиву и не полагаться на механизм поиска:

using namespace std::rel_ops; // Операторы находятся в глобальной
                              // области видимости.

    В некоторых реализациях шаблоны операторов определяются с двумя разными типами аргументов:

namespace std {
  template <class T1, class T2>
  inline bool operator!= (const T1& x, const T2& y) {
    return !(x == y);
  }
  .    .    .    .
}

    Преимущество такой реализации - возможность использования разнотипных операндов (при условии совместимости типов). Однако следует учитывать, что подобные реализации не поддерживаются стандартной библиотекой C++, поэтому в случае их применения программа утрачивает переносимость.

    Со следующего шага мы начнем знакомиться с заголовочными файлами <cstddef> и <cstdlib>.




Предыдущий шаг Содержание Следующий шаг