三元比较运算符重载

时间:2012-06-13 22:52:34

标签: c++ operator-overloading

如何实现三元比较运算符来确定(例如)a < b < c的布尔值?

2 个答案:

答案 0 :(得分:6)

解决方案: 对比较进行编码时,返回类型应为comparison对象,可以链接其他比较,但可以隐式转换为bool。这甚至可以(类型)使用未使用此意图编码的类型,只需手动将它们转换为comparison类型。

实现:

template<class T>
class comparison {
  const bool result;
  const T& last;
public:
  comparison(const T& l, bool r=true) :result(r), last(l) {}
  operator bool() const {return result;}
  comparison operator<(const T& rhs) const {return comparison(rhs, (result && last<rhs));}
  comparison operator<=(const T& rhs) const {return comparison(rhs, (result && last<=rhs));}
  comparison operator>(const T& rhs) const {return comparison(rhs, (result && last>rhs));}
  comparison operator>=(const T& rhs) const {return comparison(rhs, (result && last>=rhs));}
};

一个有用的例子:

#include <iostream>
int main() {
  //testing of chained comparisons with int
  std::cout << (comparison<int>(0) < 1 < 2) << '\n';
  std::cout << (comparison<int>(0) < 1 > 2) << '\n';
  std::cout << (comparison<int>(0) > 1 < 2) << '\n';
  std::cout << (comparison<int>(0) > 1 > 2) << '\n';
}

输出:

1
0
0
0

注意:这是由Mooing Duck创建的,可以在http://ideone.com/awrmK上找到编译的,更强大的示例

答案 1 :(得分:3)

为什么需要操作员?

inline bool RangeCheck(int a, int b, int c)
{
  return a < b && b < c;
}

或:

#define RANGE_CHECK(a, b, c) (((a) < (b)) && ((b) < (c)))