Ich bin seit etwa 8 Jahren fast ausschließlich Java-Programmierer und habe in letzter Zeit wieder mit C++ gespielt. Hier ist ein Problem, das ich im Zusammenhang mit Iteratoren in C++ STL und Java festgestellt habe.
In Java kann man eine Methode schreiben, die einen Iterator nimmt, wie zum Beispiel:
void someMethod(Iterator data) {
// ...
}
Sie übergeben einen Iterator
und die Methode muss nicht wissen, um welche zugrunde liegende Sammlung es sich bei diesem Iterator handelt, was gut ist.
In C++ gibt es keine gemeinsame Basisklasse für Iteratoren (so weit ich weiß). Ich müsste eine Funktion wie diese schreiben:
void some_function(std::vector::const_iterator data) {
// ...
}
Mit anderen Worten, some_function
weiß, dass der Iterator ein Iterator über einen vector
ist. Das ist nicht gut, weil ich möchte, dass die Funktion unabhängig davon funktioniert, um welche zugrunde liegende Sammlung es sich bei dem Iterator handelt.
Wie kann ich das in C++ machen? Wenn es wirklich nicht möglich ist, was ist dann der beste Weg, eine Funktion in C++ zu erstellen, die eine Sammlung als Parameter übernimmt, ohne zu wissen, um welche Art von Sammlung es sich genau handelt?
Nachtrag
Danke für die Antworten. Neben den Antworten habe ich einige gute Informationen dazu im Abschnitt 7.5 (Iterator Traits) des Buches The C++ Standard Library: A Tutorial and Reference (von Nicolai M. Josuttis) gefunden. Abschnitt 7.5.1 erklärt, wie man spezialisierte Versionen von Funktionen für verschiedene Iterator-Kategorien schreibt.