Ich habe Probleme mit view_facade (aus range-v3 ), um eine Ansicht zu erstellen, die sowohl const als const Zugang. Als Beispiel habe ich versucht, den View_Facade-Test (in test / view_facade.cpp) zu modifizieren, um nicht-const-Zugriff zu erlauben (standardmäßig erlaubt er nur const-Zugriff):
%Vor%Dies funktioniert gut, wenn die const-Überladungen von begin_cursor und end_cursor auskommentiert sind. Wenn ich diese Überladungen jedoch wieder hinzufüge, wird der folgende Fehler in der angegebenen Zeile (GCC 5.1) generiert:
%Vor%Es scheint die const-Version auszuwählen, die mir einen konstanten Iterator gibt. Was ich will, ist: const Iteratoren für const Objekte und nicht-const Iteratoren für nicht-const Objekte. Wie kann ich das erreichen?
view_facade
dient zum Erstellen von Ansichten. Ansichten beziehen sich auf Daten, die ihnen nicht gehören. Sie sind wie Zeiger darin, dass sie logisch Rückweisungen sind. Und wie Pointer, hat die oberste Ebene const
sollte keine Auswirkungen auf die const
-Ness der referenzierten Daten. Das heißt, ob Sie eine int*
oder eine int*const
dereferenzieren, das Ergebnis ist dasselbe: int&
.
Ihre Ansicht ist keine Ansicht. Es besitzt seine Daten. (Siehe vector<int> ints_
data member.) Der Versuch, view_facade
zu verwenden, um diese Datenstruktur in eine Ansicht zu verwandeln, führt zwangsläufig zu Frustration. Dies ist sehr von Design. Ansichten unterscheiden sich von Containern. Die Range-v3-Bibliothek enthält keine Container-Fassade, sorry.
(Was passiert: Da die Ansichten die Indirection darstellen, versucht view_facade
sehr, const und non-const begin()
und end()
die gleichen Typen zurückzugeben. Wenn cursor_begin() const
vorhanden ist, ist diese Immer gewählt. Immer wenn Code unterbrochen wird, liegt das meist daran, dass der Code Container mit Ansichten verwechselt.)