De nombreux articles sur les itérateurs constants (exemple), mais aucun dans le contexte des boucles comme:
for (const auto it: container) {...}
Lorsque j'ai commencé à implémenter, le compilateur m'a encouragé par les plaignants sur les begin
et end
manquants, en espérant que de tels plaignants puissent m'aider à combler les pièces manquantes. J'avais tort. Le code suivant se compile bien même s'il manque sûrement l'équivalent de operator++
et operator!=
:
#include
template class List { public:
const T *head;
const List *tail;
List(const T *h, const List *t):head(h),tail(t){}
const T *operator*() const { return head; } };
template const List *begin(const List *l) { return l; }
template const List *end (const List *l) { return nullptr; }
class Person { public: int age; Person(int a):age(a){} };
typedef List Persons;
int main(int argc, char **argv) {
Person *p1 = new Person(16);
Person *p2 = new Person(27);
Person *p3 = new Person(38);
Persons *persons = new Persons(p1,
new Persons(p2,
new Persons(p3, nullptr)));
for (const auto p: persons) { std::cout << (*p)->age << "\n"; }
return 0; }
Comment se fait-il que ce code se compile?