#include <iostream>
#include <iterator>

template<class B,class E> struct range_iter{
  B b; E e;
  range_iter(B b_,E e_):b(b_),e(e_){}
  B& begin(){return b;} E& end(){return e;}
  range_iter<B,E>& operator++(){++b; return *this;}
  typename std::iterator_traits<B>::reference operator*(){return *b;}
  bool has_next(){return b!=e;}
};
template<class B,class E> range_iter<B,E> to_ri(B b, E e){return range_iter<B,E>(b,e);}

int main(){
  int a[] = {0,10,20,30,40};
  for(auto it=to_ri(a+1, a+3); it.has_next(); ++it){std::cout<<*it<<std::endl;}
//for(auto e : to_ri(a+1, a+3)){...}
  return 0;
}