In den letzten 8 Jahren habe ich fast ausschließlich in Java programmiert, und in letzter Zeit habe ich mich wieder mit C++ beschäftigt. Hier ist ein Problem, das ich in Bezug auf Iteratoren in C++ STL und Java aufgeworfen habe.
In Java können Sie eine Methode schreiben, die einen Iterator wie folgt aufnimmt:
void someMethod(Iterator<String> data) {
// ...
}
Sie geben in einer Iterator
und die Methode braucht nicht zu wissen, was die zugrunde liegende Sammlung dieses Iterators ist, was gut ist.
In C++ gibt es keine gemeinsame Basisklasse für Iteratoren (soweit ich weiß). Ich müsste eine Funktion wie diese schreiben:
void some_function(std::vector<std::string>::const_iterator data) {
// ...
}
Mit anderen Worten, some_function
weiß, dass der Iterator ein Iterator über eine vector
. Das ist nicht gut, denn ich möchte, dass die Funktion unabhängig von der zugrunde liegenden Auflistung der Iterator ist zu arbeiten.
Wie kann ich dies in C++ tun? Wenn das nicht wirklich möglich ist, wie kann ich dann am besten eine Funktion in C++ erstellen, die eine Sammlung als Parameter annimmt, aber nicht wissen muss, um welche Art von Sammlung es sich genau handelt?
Nachtrag
Vielen Dank für die Antworten. Zusätzlich zu den Antworten habe ich einige gute Informationen dazu in Abschnitt 7.5 (Iterator Traits) des Buches gefunden Die C++-Standardbibliothek: Ein Tutorial und eine Referenz (von Nicolai M. Josuttis). Abschnitt 7.5.1 erklärt, wie man spezielle Versionen von Funktionen für verschiedene Iterator-Kategorien schreibt.