#ifndef NUM_RANGE #define NUM_RANGE template struct Derefable { const T& operator*() const { return x; } operator T&() { return x; } Derefable(const T& x=T{}) : x{x} { } private: T x; }; namespace std { template Derefable begin(const T&) { return {}; } template Derefable end(const T& x) { return x; } } // usage example // for (int i : 5) { ... } #endif