Bereich-v3: Verwenden Sie view_facade, um sowohl konstante als auch nicht-konstante Iteratoren bereitzustellen

8

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%

Vollständiger Code hier.

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?

    
edflanders 15.07.2015, 02:33
quelle

1 Antwort

9

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.)

    
Eric Niebler 16.07.2015, 19:01
quelle

Tags und Links