vectorを逆順に出します。
template<typename T> class cReversed : public cIterable<T> { const vector<T> v; typename vector<T>::const_reverse_iterator p; bool first; public: cReversed(const vector<T>& w) : v(w), first(true) { } bool exists_next() { if(first) { first = false; p = v.rbegin(); } else { ++p; } return p != v.rend(); } T value() const { return *p; } }; template<typename T> shared_ptr<cIterable<T>> reversed(const vector<T>& v) { return shared_ptr<cIterable<T>>(new cReversed<T>(v)); } int main() { cout << reversed(list(range(3))) << endl; // 2 1 0 }