K
Nexus schrieb:
Hat Alexandrescu eigentlich mehr dazu gesagt als Iterators Must Go, evtl. sogar eine Beispielimplementierung bereitgestellt?
Er hat einiges gesagt innerhalb der ca 60 Minuten. Das, was ihn an Iteratoren gestört hat, ist, dass sie "dumm" seien und selbst nicht wüssten, ob man sie z.B. ohne Probleme inkrementieren könne. Sie seien dazu unpraktisch, weil man immer zwei von ihnen für eine Sequenz bräuchte, was u.a. auch die Komposition schwieriger mache. Er schlug deswegen ein anderes Konzept vor, was weniger fehleranfällig, praktischer und ausreichend mächtig sei (er habe alle STL-Algorithmen auf Basis seines Range-Konzepts implementieren können). Beispiele werden natürlich auch gezeigt. Ich fand das interessant, aber auch leider nicht komplett überzeugend. Einige im Publikum (mich eingeschlossen) waren nicht ganz überzeugt davon, das das Konzept mächtig genug ist, dass man komplett ohne Iteratoren auskommen kann. Solche Ranges sind auf Basis von Iteratoren schon implementierbar. Andersherum aber nicht. Das macht es IMHO etwas schwieriger, dafür zu argumentieren, dass sein Range-Konzept mächtig genug ist.
Nexus schrieb:
krümelkacker schrieb:
Damit kann ich leider nichts anfangen. Was verstehst du unter "strukturellem const"? Was ist "Range" hier?
Soweit ich ihn verstehe: struct const heisst, nur die Elemente dürfen verändert werden, nicht die Struktur des Containers (z.B. Anzahl der Elemente). Eben nur der Zugriff, den auch Iteratoren haben.
Aha. Dann werden ihm die "Alexandrescu-Ranges" sicher gefallen. Denn die können die "Struktur eines Containers" genauso wenig verändern, wie Iteratoren.
Nexus schrieb:
Shade Of Mine schrieb:
template<class Range>
sort(Range range);
loest das Problem.
Ja, nur führt der Aufruf sort(vec) zu einer Kopie und sortiert den Original-Container nicht. Schöne "Lösung"
In Alexandrescu's Range-Welt, würde man das so aufrufen:
sort(meinvector.all());
also statt begin/end ein all anbieten, was ein Range-Objekt liefert, welches ähnlich wie Iteratoren auch per Wert übergeben werden kann; denn es hat immer Referenzsemantik. Nach diesem Modell sind Container keine Ranges.