Wie wird std :: advance implementiert, um das Verhalten des Iteratortyps zu ändern?

9

Was wir über std::advance wissen, ist Folgendes:

%Vor%

Zweck

Erweitert den Iterator i by n elements.

Wenn i ein Direktzugriffs-Iterator ist, verwendet die Funktion einmal operator+ oder operator- , anderenfalls verwendet die Funktion wiederholt den Operator zum Erhöhen oder Verringern ( operator++ oder operator-- ) bis n Elemente wurden erweitert.

Meine Frage ist die folgende: Wie ist std::advance so implementiert, dass es erkennt ob it ein Random Access Iterator ist oder nicht? Woher weiß es, dass es operator+ anstelle von operator++ verwenden kann?

    
Narek 12.03.2013, 18:00
quelle

2 Antworten

18

Durch iterator_traits und Tag-Versand :

%Vor%

Beachten Sie, dass iterator_category ein Typ ist (einer von std::input_iterator_tag usw.), also ist iterator_category() kein Funktionsaufruf; Es ist ein Ausdruck, der einen temporären prvalue dieses Typs erstellt. Die entsprechende Überladung von advance_impl wird dann durch normale Überladungsauflösung ausgewählt. Dies wird als Tag-Versand bezeichnet. Äquivalent könnte man schreiben:

%Vor%

Die Überladungen von advance_impl erhalten als drittes Argument ein unbenanntes Argument, das eine Instanz des gewählten Tag-Typs ist.

    
ecatmur 12.03.2013, 18:04
quelle
1

Ich könnte mir vorstellen, dass es std::iterator_traits::iterator_category verwendet, um herauszufinden, was der Typ des Iterators ist.

Darauf basierend kann es entscheiden, wie man Dinge voranbringt.

    
Tony The Lion 12.03.2013 18:04
quelle

Tags und Links