当运算符<存在时,为什么要定义 LT?

why define lt when operator< exists?

本文关键字:为什么 定义 LT 运算符 lt 存在      更新时间:2023-10-16

矢量运算的一段代码包含以下类模板定义:

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); } 
};

但为什么呢?它没有使用额外的异常处理,并且它依赖于已经具有operator<operator>的类T的对象。操作人员的使用是否同样容易?还是应该使用模板类进行比较?

只要有人想要一个二进制谓词,即一个带两个参数的自由函数,就可以使用这些模板。重载的operator<可能不会被定义为自由的二进制函数,因此只要表达式a < b可以被解析,这些模板就可以作为一种适配器,让您使用现有的运算符,无论它们是如何定义的。

请注意,该标准已经提供了非常相似的*模板;它们被称为std::lessstd::greater,例如,它们被有序的关联容器使用。

*)标准库谓词为它们如何处理指针提供了额外的保证

问题是比较并不总是数字的。有时可以比较两个对象,并且大于或小于的可以有新的定义。例如,在包含类型的对象的class中,可以以自定义方式定义坐标比较。例如:

Coordinate c1(3,5)
Coordinate c2(4,2)

无论何时c1.x > c2.xc1.y>c2.y

,我们都可以重载> operator以为c1>c2返回True