0

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

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>。使用运算符不是一样容易/更容易吗?还是应该使用模板类进行比较?

4

2 回答 2

4

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

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

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

于 2013-07-26T09:05:45.137 回答
0

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

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

我们可以重载以在任何时候> operator返回 True或c1>c2c1.x > c2.xc1.y>c2.y

于 2013-07-26T09:39:54.497 回答