Ich bevorzuge folgende Variante, unter Verwendung von Concept auto (constrained auto):
void advance_(std::input_iterator auto& i, int n){ // (1) std::cout << "InputIterator used" << '\n'; while (n--) ++i; } void advance_(std::bidirectional_iterator auto& i, int n){ // (2) std::cout << "BidirectionalIterator used" << '\n'; if (n >= 0) while (n--) ++i; else while (n++) --i; } void advance_(std::random_access_iterator auto& i, int n){ // (3) std::cout << "RandomAccessIterator used" << '\n'; i += n; }
Wenn du die Typen für n festnagelst mußt du aber ptrdiff_t nehmen und nicht int
https://en.cppreference.com/w/cpp/types/ptrdiff_t
Habs eben schon geschrieben: in der Spezialisierung für std::input_iterator muß auf n>0 geprüft werden, also
void advance_(std::input_iterator auto& i, std::ptrdiff_t n){ // (1)
std::cout << "InputIterator used" << '\n';
while (n-- > 0) ++i;
}
Das Posting wurde vom Benutzer editiert (04.04.2022 17:53).