为什么在运算符<存在?

时间:2013-07-26 09:02:36

标签: c++ vector operators class-template

矢量操作的一段代码包含这些类模板定义:

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

但为什么呢?它没有使用额外的异常处理,而是依赖于已经拥有Toperator<的类operator>的对象。使用运营商不是那么简单/容易吗?或者应该使用模板类进行比较?

2 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:0)

事情是比较并不总是数字。有时可以比较两个对象,大于小于可以有新的定义。例如在坐标类型对象的> class 可以自定义方式定义比较。 例如:

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

我们可以重载> operator,只要c1>c2c1.x > c2.x

,就会c1.y>c2.y返回True