三元比较运算符重载(Ternary comparison operator overloading)

2019-06-25 11:35发布

一个如何实施的三元比较运算符,以确定,例如,布尔值a < b < c

Answer 1:

解决方案:当编码一比较,有返回类型是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

注:这是通过创建鸣叫鸭 ,和编译的,更强大的例子上可以找到http://ideone.com/awrmK



Answer 2:

为什么你需要操作?

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

要么:

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


文章来源: Ternary comparison operator overloading