当运算符<存在时,为什么要定义 LT?
why define lt when operator< exists?
矢量运算的一段代码包含以下类模板定义:
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::less
和std::greater
,例如,它们被有序的关联容器使用。
*)标准库谓词为它们如何处理指针提供了额外的保证
问题是比较并不总是数字的。有时可以比较两个对象,并且大于或小于的可以有新的定义。例如,在包含类型的对象的class中,可以以自定义方式定义坐标比较。例如:
Coordinate c1(3,5)
Coordinate c2(4,2)
无论何时c1.x > c2.x
或c1.y>c2.y
> operator
以为c1>c2
返回True
相关文章:
- 为什么在定义函数之前先声明它
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 如果我重新定义 sqrt 函数,为什么使用 std::sqrt 失败?
- 为什么我不能在主函数之外定义一个类的对象(它继承了另一个类)?
- 为什么用户定义的函数不按照给定的顺序对相同长度的元素进行排序?
- 为什么定义复制构造函数会给我错误:无法将类型 'obj&' 的非常量左值引用绑定到类型为"obj"的右值?
- 为什么定义移动构造函数会删除移动赋值运算符
- 为什么定义了移动构造函数并隐式删除了赋值运算符?
- 为什么定义了sizeof实现的结果
- 在哪里定义油漆以及为什么定义HDC
- 为什么定义了布尔"++"运算符?但是"--"不在C++
- (C++)为什么定义构造函数会导致我的程序无法编译
- 为什么定义成员函数指针变量需要类名
- iostream为什么定义abs函数,以及如何停止它
- 为什么定义了无符号整数溢出行为,但没有定义有符号整数溢出行为?
- 当使用extern在文件之间共享常量时,为什么定义中需要extern
- 为什么定义 #if 0 && (_MSC_VER > 1000)?
- 为什么定义rsize_t
- 为什么定义一个以返回类型作为其类的方法不会给我一个"不完整的类型"错误