reversed

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
}