#include <iostream>
#include <cassert>
#include <vector>
#include <type_traits>
using namespace std;
template<class C>
struct Iterator{
operator bool() const{
return startiterator != enditerator;
}
const Iterator &operator ++(){
assert(*this);
startiterator++;
return *this;
}
const Iterator operator ++(int){
Iterator other(*this);
startiterator++;
return other;
}
typename C::iterator startiterator, enditerator;
//typename C::iterator sollte durch decltype(C::begin()) oder so ersetz werden
Iterator(C &c) : startiterator(c.begin()), enditerator(c.end()){
}
auto operator *() -> decltype(*startiterator){
//hier muss man noch was mit add_const und add_rvalue_reference machen
return *startiterator;
}
};
//Am ende den ganzen Spaß nochmal für const-Iterator
int main(){
vector<int> v = {42, 37, 128};
Iterator<vector<int>> it(v); //kann man noch in eine makeIterator-Funktion tun
while (it){
cout << *it << ' ';
it++;
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y2Fzc2VydD4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwogCnRlbXBsYXRlPGNsYXNzIEM+CnN0cnVjdCBJdGVyYXRvcnsKICAgIG9wZXJhdG9yIGJvb2woKSBjb25zdHsKICAgICAgICByZXR1cm4gc3RhcnRpdGVyYXRvciAhPSBlbmRpdGVyYXRvcjsKICAgIH0KICAgIGNvbnN0IEl0ZXJhdG9yICZvcGVyYXRvciArKygpewogICAgICAgIGFzc2VydCgqdGhpcyk7CiAgICAgICAgc3RhcnRpdGVyYXRvcisrOwogICAgICAgIHJldHVybiAqdGhpczsKICAgIH0KICAgIGNvbnN0IEl0ZXJhdG9yIG9wZXJhdG9yICsrKGludCl7CiAgICAgICAgSXRlcmF0b3Igb3RoZXIoKnRoaXMpOwogICAgICAgIHN0YXJ0aXRlcmF0b3IrKzsKICAgICAgICByZXR1cm4gb3RoZXI7CiAgICB9CiAgICB0eXBlbmFtZSBDOjppdGVyYXRvciBzdGFydGl0ZXJhdG9yLCBlbmRpdGVyYXRvcjsKICAgIC8vdHlwZW5hbWUgQzo6aXRlcmF0b3Igc29sbHRlIGR1cmNoIGRlY2x0eXBlKEM6OmJlZ2luKCkpIG9kZXIgc28gZXJzZXR6IHdlcmRlbgogICAgSXRlcmF0b3IoQyAmYykgOiBzdGFydGl0ZXJhdG9yKGMuYmVnaW4oKSksIGVuZGl0ZXJhdG9yKGMuZW5kKCkpewogICAgfQogCiAgICBhdXRvIG9wZXJhdG9yICooKSAtPiBkZWNsdHlwZSgqc3RhcnRpdGVyYXRvcil7CiAgICAgICAgLy9oaWVyIG11c3MgbWFuIG5vY2ggd2FzIG1pdCBhZGRfY29uc3QgdW5kIGFkZF9ydmFsdWVfcmVmZXJlbmNlIG1hY2hlbgogICAgICAgIHJldHVybiAqc3RhcnRpdGVyYXRvcjsKICAgIH0KfTsKIAovL0FtIGVuZGUgZGVuIGdhbnplbiBTcGHDnyBub2NobWFsIGbDvHIgY29uc3QtSXRlcmF0b3IKIAppbnQgbWFpbigpewogICAgdmVjdG9yPGludD4gdiA9IHs0MiwgMzcsIDEyOH07CiAgICBJdGVyYXRvcjx2ZWN0b3I8aW50Pj4gaXQodik7IC8va2FubiBtYW4gbm9jaCBpbiBlaW5lIG1ha2VJdGVyYXRvci1GdW5rdGlvbiB0dW4KICAgIHdoaWxlIChpdCl7CiAgICAgICAgY291dCA8PCAqaXQgPDwgJyAnOwogICAgICAgIGl0Kys7CiAgICB9Cn0=