Was wir über std::advance
wissen, ist Folgendes:
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?
Durch iterator_traits
und Tag-Versand :
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:
Die Überladungen von advance_impl
erhalten als drittes Argument ein unbenanntes Argument, das eine Instanz des gewählten Tag-Typs ist.
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.
Tags und Links c++ implementation std stdadvance