Кусок кода для векторных операций содержит следующие определения шаблонов классов:
template <class T>
class lt {
public:
static int compare(T a, T b) { return(a < b); }
};
template <class T>
class gt {
public:
static int compare(T a, T b) { return(a > b); }
};
Но почему? Он не использует дополнительную обработку исключений и опирается на объекты класса T
уже имея operator<
а также operator>
, Разве не так просто / легко пользоваться операторами? Или следует использовать шаблонные классы для сравнения?
Эти шаблоны могут использоваться всякий раз, когда кто-то ожидает двоичный предикат, то есть бесплатную функцию, принимающую два параметра. Перегружен operator<
может не определяться как свободная двоичная функция, поэтому эти шаблоны служат своего рода адаптером, позволяющим вам использовать существующие операторы независимо от того, как они были определены, до тех пор, пока выражение a < b
может быть решена.
Обратите внимание, что стандарт уже предоставляет очень похожие * шаблоны; они называются std::less
а также std::greater
и они используются, например, в упорядоченных ассоциативных контейнерах.
*) Предикаты стандартной библиотеки предоставляют дополнительные гарантии того, как они работают с указателями.
Дело в том, что сравнение не всегда числовое. Иногда можно сравнивать два объекта и лучше чем или же меньше, чем может иметь новые определения. Например, в учебный класс который содержит объекты типа Координаты Сравнение может быть определено индивидуально.
Например :
Coordinate c1(3,5)
Coordinate c2(4,2)
Мы можем перегрузить > operator
вернуть True для c1>c2
всякий раз, когда c1.x > c2.x
или же c1.y>c2.y