fork download
  1. #include <type_traits>
  2.  
  3. template<class T> class Range {
  4. class const_iterator {
  5. using I = typename std::conditional<std::is_enum<T>::value,
  6. typename std::underlying_type<T>::type, T>::type;
  7. I i;
  8. public:
  9. const_iterator(const T &i) : i(static_cast<I>(i)) {}
  10. const T operator*() const { return static_cast<T>(i); }
  11. const_iterator &operator++(){ ++i; return *this; }
  12. bool operator!=(const const_iterator &o) const { return i != o.i; }
  13. };
  14. T b, e;
  15. public:
  16.  
  17. Range(const T &b, const T &e) : b(b), e(e) {}
  18. const_iterator begin() const { return b; }
  19. const_iterator end() const { return e; }
  20. };
  21.  
  22. enum struct Square : std::size_t {
  23. ZERO, ONE, TWO, THREE, SENTINEL
  24. };
  25.  
  26. Range<Square> SQ(Square::ZERO, Square::SENTINEL);
  27.  
  28. #include <iostream>
  29. using namespace std;
  30. int main(){
  31. for(auto s : SQ) cout << static_cast<size_t>(s) << endl;
  32. return 0;
  33. }
Success #stdin #stdout 0s 3460KB
stdin
Standard input is empty
stdout
0
1
2
3