Iterator "constness" prüfen / ändern

8

Ich habe zweieinhalb eng verwandte Fragen. Gegeben ein STL-Iterator-Typ, der als Template-Parameter übergeben wurde:

  1. Wie kann man feststellen, ob der Typ einem const- oder non-const-Iterator entspricht?
  2. Alternativ zu 1., wie (z. B. mit enable_if s), dass dieser Typ einem nichtkonstanten Iterator entspricht?
  3. Wie erhalte ich die Kons- version des Iterators von der nichtkonstanten (und umgekehrt )? [Anmerkung: beantwortet in dieser Beitrag ; nicht überraschend, du kannst nicht. ]

Woher kommt diese Frage?

Ich schrieb eine kleine Klasse, um arithmetische / relationale / algebraische Operationen an Vektoren zu erleichtern (mit Vektor meine ich 1d Daten fester Größe, nicht die STL-Vektoren). Anstatt einen spezifischen Datencontainer zu erstellen, habe ich eine Schnittstelle definiert und verschiedene mögliche Container abgeleitet, die im Prinzip verschiedene Arten der Datenspeicherung "einwickeln". Einer dieser Container ist ein Wrapper für STL-Iteratoren, und ich habe einige Probleme damit.

    
Sheljohn 11.05.2013, 15:23
quelle

3 Antworten

6

Frage 1:

Sie könnten das folgende Typenmerkmal verwenden:

%Vor%

Hier ist eine Demonstration:

%Vor%

Und hier ist ein Live-Beispiel .

Frage 2:

Mit dem obigen Typenmerkmal wird dies einfach. Angenommen, Sie haben eine Funktionsvorlage foo() , die Sie einschränken möchten, so dass sie nur nicht const iterators akzeptiert:

%Vor%

Und ein einfaches Demonstrationsprogramm:

%Vor%

Und hier ist ein Live-Beispiel .

    
Andy Prowl 11.05.2013, 15:31
quelle
3

Für 1) könnten Sie so etwas tun:

%Vor%

Oder das:

%Vor%

Sie können diese Prädikate verwenden, um an std::enable_if zu übergeben, um 2) zu implementieren.

HINWEIS: Wie von R. Martinho Fernandes in den Kommentaren hervorgehoben, schlagen diese Prädikate fehl, wenn der betreffende Iterator einen anderen Typ als einfache Referenzen für sein reference Merkmal verwendet (z. B. std::vector<bool>::const_iterator tut es).

    
Angew 11.05.2013 15:27
quelle
2

Sie könnten SFINAE auf

verwenden %Vor%

oder (Xeo's Vorliebe)

%Vor%

überprüft, ob Dereferenzierung des Iterators Ihnen etwas zuweisbares gibt. Nicht perfekt, wenn der Elementtyp der Sammlung nicht zuweisbar ist, aber was nützt es dann, ein nicht const_iterator zu haben?

Testen Sie nicht für const_iterator , testen Sie für die Operation, die Ihr Algorithmus tatsächlich benötigt.

    
Ben Voigt 11.05.2013 15:44
quelle

Tags und Links