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