fork download
  1. #include <iostream>
  2.  
  3. template <typename T>
  4. void DisplayContents (const T& Input)
  5. {
  6. for (auto iElement = Input.cbegin() // no intellisense
  7. ; iElement != Input.cend()
  8. ; ++ iElement )
  9. std::cout << *iElement << ' ';
  10.  
  11. std::cout << std::endl;
  12. }
  13.  
  14. template <typename T>
  15. class Range
  16. {
  17. public:
  18. class iterator {
  19. friend class Range;
  20.  
  21. private:
  22. explicit iterator(T value);
  23.  
  24. T value;
  25.  
  26. public:
  27. T operator*() const;
  28.  
  29. iterator & operator++();
  30. iterator operator++(int);
  31.  
  32. bool operator==(iterator const &) const;
  33. bool operator!=(iterator const &) const;
  34. };
  35.  
  36. public:
  37. Range(T begin, T end);
  38.  
  39. iterator cbegin() const;
  40. iterator cend() const;
  41.  
  42. private:
  43. T begin;
  44. T end;
  45. };
  46.  
  47. template <typename T>
  48. Range<T>::Range(T begin, T end) : begin(begin), end(end) { }
  49.  
  50. template <typename T>
  51. typename Range<T>::iterator Range<T>::cbegin() const {
  52. return iterator(begin);
  53. }
  54.  
  55. template <typename T>
  56. typename Range<T>::iterator Range<T>::cend() const {
  57. return iterator(end);
  58. }
  59.  
  60. template <typename T>
  61. Range<T>::iterator::iterator(T value) : value(value) { }
  62.  
  63. template <typename T>
  64. typename Range<T>::iterator & Range<T>::iterator::operator++() {
  65. ++value;
  66. return *this;
  67. }
  68.  
  69. template <typename T>
  70. typename Range<T>::iterator Range<T>::iterator::operator++(int) {
  71. auto copy = *this;
  72. ++value;
  73. return copy;
  74. }
  75.  
  76. template <typename T>
  77. bool Range<T>::iterator::operator==(iterator const & other) const {
  78. return other.value == value;
  79. }
  80.  
  81. template <typename T>
  82. bool Range<T>::iterator::operator!=(iterator const & other) const {
  83. return !this->operator==(other);
  84. }
  85.  
  86. template <typename T>
  87. T Range<T>::iterator::operator*() const {
  88. return value;
  89. }
  90.  
  91. int main() {
  92. Range<int> range(0, 5);
  93.  
  94. DisplayContents(range);
  95.  
  96. return 0;
  97. }
Success #stdin #stdout 0s 3340KB
stdin
Standard input is empty
stdout
0 1 2 3 4