Ich habe zweieinhalb eng verwandte Fragen. Gegeben ein STL-Iterator-Typ, der als Template-Parameter übergeben wurde:
enable_if
s), dass dieser Typ einem nichtkonstanten Iterator entspricht? 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.
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:
Und ein einfaches Demonstrationsprogramm:
%Vor%Und hier ist ein Live-Beispiel .
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).
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.