#include <iostream>
#include <vector>
using namespace std;

#define METHOD(NAME, ...) auto NAME __VA_ARGS__ -> decltype(m_T.r##NAME) { return m_T.r##NAME; }
template<typename T>
struct Reverse
{
  T& m_T;

  METHOD(begin());
  METHOD(end());
  METHOD(begin(), const);
  METHOD(end(), const);
};
#undef METHOD

template<typename T>
Reverse<T> MakeReverse (T& t) { return Reverse<T>{t}; }

int main ()
{
  vector<int> v = {0, 1, 2, 3, 4, 5}; 

  cout << "\nForward: ";
  for(auto& i : v)
    cout << i << ", ";

  cout << "\nReverse: ";
  for(auto& i : MakeReverse(v))
    cout << i << ", ";
}
