namespace
<utility>

std::rel_ops

namespace rel_ops {  template <class T> bool operator!= (const T& x, const T& y);  template <class T> bool operator>  (const T& x, const T& y);  template <class T> bool operator<= (const T& x, const T& y);  template <class T> bool operator>= (const T& x, const T& y);}
Relational Operators
此命名空间声明了四个关系运算符(!=><=>=)的模板函数,它们的行为分别派生自 operator==(用于 !=)和 operator<(用于 ><=>=)。

1
2
3
4
5
6
namespace rel_ops {
  template <class T> bool operator!= (const T& x, const T& y) { return !(x==y); }
  template <class T> bool operator>  (const T& x, const T& y) { return y<x; }
  template <class T> bool operator<= (const T& x, const T& y) { return !(y<x); }
  template <class T> bool operator>= (const T& x, const T& y) { return !(x<y); }
}

这避免了为每种完整类型声明所有六个关系运算符的必要性;只需定义两个:operator==operator<,并导入此命名空间,所有六个运算符都将为该类型定义(但如果在导入时未定义它们,则不会通过依赖于参数的查找来选择它们)。

请注意,使用此命名空间会将这些重载引入到所有未定义自己的重载的类型中。然而,由于非模板函数优先于模板函数,因此对于特定类型,可以通过定义不同的行为来重写这些运算符中的任何一个。

模板参数

T
对于 operator!=,该类型应为 EqualityComparable
当一个类型支持 operator== 操作并遵循等价关系的典型自反对称传递属性时,它就是 EqualityComparable

对于 operator>operator<=operator>=,该类型应为 LessThanComparable
当一个类型支持 operator< 操作并定义了有效的严格弱序关系时,它就是 LessThanComparable

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// rel_ops example:
#include <iostream>     // std::cout, std::boolalpha
#include <utility>      // std::rel_ops
#include <cmath>        // std::sqrt

class vector2d {
public:
  double x,y;
  vector2d (double px,double py): x(px), y(py) {}
  double length() const {return std::sqrt(x*x+y*y);}
  bool operator==(const vector2d& rhs) const {return length()==rhs.length();}
  bool operator< (const vector2d& rhs) const {return length()< rhs.length();}
};

int main () {
  using namespace std::rel_ops;
  vector2d a (10,10);	// length=14.14
  vector2d b (15,5);	// length=15.81
  std::cout << std::boolalpha;
  std::cout << "(a<b) is " << (a<b) << '\n';
  std::cout << "(a>b) is " << (a>b) << '\n';
  return 0;
}

输出

(a<b) is true
(a>b) is false


因为我们使用了rel_ops,对于所有定义了operator<(例如vector2d)的类型,也定义了operator>.

数据竞争

参数被传递给适当的 operator==operator< 重载,这些重载可以访问它们。
在任何情况下,这些函数都不能修改其参数(它们是 const 限定的)。

异常安全

如果元素的类型以无异常保证的方式支持相应的操作,则该函数永远不会抛出异常(无异常保证)。

另见