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