fork download
  1. //chaining comparison object
  2. template<class T>
  3. class comparison {
  4. const bool result;
  5. const T& last;
  6. public:
  7. comparison(const T& l, bool r=true) :result(r), last(l) {}
  8. operator bool() const {return result;}
  9. comparison operator<(const T& rhs) const {return comparison(rhs, (result && last<rhs));}
  10. comparison operator<=(const T& rhs) const {return comparison(rhs, (result && last<=rhs));}
  11. comparison operator>(const T& rhs) const {return comparison(rhs, (result && last>rhs));}
  12. comparison operator>=(const T& rhs) const {return comparison(rhs, (result && last>=rhs));}
  13. };
  14.  
  15. //random object that has operator chaining built in
  16. struct a {
  17. int val;
  18. comparison<a> operator<(const a& rhs) const {return comparison<a>(rhs, val<rhs.val);}
  19. comparison<a> operator<=(const a& rhs) const {return comparison<a>(rhs, val<=rhs.val);}
  20. comparison<a> operator>(const a& rhs) const {return comparison<a>(rhs, val>rhs.val);}
  21. comparison<a> operator>=(const a& rhs) const {return comparison<a>(rhs, val>=rhs.val);}
  22. };
  23.  
  24. #include <iostream>
  25. int main() {
  26. a v0 = {0};
  27. a v1 = {1};
  28. a v2 = {2};
  29. //testing of chained comparisons with builtin
  30. std::cout << (v0<v1<v2) << '\n';
  31. std::cout << (v0<v1>v2) << '\n';
  32. std::cout << (v0>v1<v2) << '\n';
  33. std::cout << (v0>v1>v2) << '\n';
  34. //testing of chained comparisons with int
  35. std::cout << (comparison<int>(0)<1<2) << '\n';
  36. std::cout << (comparison<int>(0)<1>2) << '\n';
  37. std::cout << (comparison<int>(0)>1<2) << '\n';
  38. std::cout << (comparison<int>(0)>1>2) << '\n';
  39. }
  40.  
Success #stdin #stdout 0s 2884KB
stdin
Standard input is empty
stdout
1
0
0
0
1
0
0
0