Von dem Versuch, eine Tabelle zu iterieren
-
Also folgende Gedanken habe ich mir gemacht.
Mit dem slice kann man selber nicht so viel anstellen, vor allem nichts, was die Topologie des Arrays verändern soll.
Der slice_iterator hingegen soll verwendet werden können, um Spalten und Zeilen einfügen zu können.
Sowohl slice_iterator wie auch element_iteratoren funktionieren soweit ich das auch getestet habe const-correct.
Wenn ich nun aus einem const_slice_iterator einen slice hole, dann soll ich über diesen slice auch wiederum nur const_element_iterator'en rausholen können.
So hatte ich die const-Behandlung zumindest geplant.Edit: Und aufgrund der static_if-Magie, die ich da unlängst exemplarisch gezeigt habe, gibt die nicht-const-Variante von slice::begin des slices, das man aus einem const_slice_iterator bekommt, auch einfach einen const_element_iterator zurück (das war wieder kompliziert^^).
-
Decimad schrieb:
Das array2d ist aber nicht direkt über den Wert-Typ templatisiert, sondern über einen ganzen Container im Moment. Den genauen Typ bekommt der slice also über den Wert-Typ selber nicht heraus.
Okay, das ist natürlich blöder. Ich nehme an, der Containertyp wird tatsächlich gebraucht und kann nicht wegabstrahiert werden. Ich würde jedenfalls davon ausgehen, dass sowohl Container als auch seine Elemente nicht
constsind. Wenn jemandarray2d<const std::vector<const int>>benutzt, darf ihm das ruhig um die Ohren fliegen.
Das ändert aber nichts am Grundsatz, die Template-Parameter möglichst einfach zu halten. Versuche eben, statt
slice_type<array2d<vector<float>>>>"nur" 3 Verschachtelungsebenenslice_type<vector<float>>>zu haben.
-
Das kann ich natürlich machen, stimmt, werde ich auch gleich mal.
Jetzt sind wir aber ein bisschen von dieser begin-Sache mit dem static_if weggekommen. Habe ich das schlüssig genug erklärt, dass Du verstanden hast, weshalb ich das im Moment machen muss (ich denke, das funktioniert eigentlich ganz gut, aber schön ist es dennoch nicht)? Das ist alles sehr verwinkelt
-
Args, also array2d ist über den Container UND über die Element-Anordnung templatisiert, das heißt um eine Ebene zu gewinne, bräuchte ich mehr Template-Argumente bei den ganzen Typen, ist es das dann immernoch wert?
Edit: Ich denke, schon alleine dass man die Typen damit auf array2d einschießt, ist Grund genug... Nicht dass jemand versucht, sie zweckzuentfremden.Edit2: Args2 -.- Über den ArrayType-Typ habe ich auch die Information übertragen, ob es sich um eine const-Ausprägung (dann war das einfach const array2d<...>) des Iterators handeln soll oder nicht, wenn ich das jetzt flach mache, weiß ich nicht, wie ich diese Information reinbekommen soll, ohne nochmal auszuholen und einen bool IsConst-Parameter hinzuzufügen -.-
-
Sooo!
Ich habe einmal std::conditional und std::remove_const eingearbeitet. Dann habe ich, wie beschrieben, die Template-Argumente flach gemacht und bei den Typen, wo es nötig war ein bool-Template-Argument hinzugefügt, das ausdrückt, ob die jeweilige Instanz gerade const sein soll oder nicht. Schön ist, dass die const-Sache so auch etwas transparenter ist. Dafür sind die Zeilen etwas länger geworden, hehe.
-
Jetzt auch mit reshape und reserve, wobei etwas ungetestet
