for_each() die Dritte

Durch die Erfolge mit dem Einsatz der Iteratoren gestärkt, versuchen wir nun das Ganze 'mal mit for_each(). Dazu lesen wir beispielsweise in der sgi-Dokumentation nach und finden:

Aha! (???)
Ein InputIterator ist ein Eingabe-Iterator, mit dem wir lesend auf das referenzierte Element zugreifen können. Verändern kann man ein Element nicht, das von einem Eingabe-Iterator referenziert wird. Nun ja, das wird uns nicht weiter berühren, wie Sie noch sehen werden. Außerden wissen wir bereits, dass for_each() zu den nichtmodifizierenden Algorithmen gehört.

Aber was, bitteschön, ist eine UnaryFunction?
Eine Stunde später sind wir schlauer und wissen inzwischen:
Es handelt sich um eine Funktion, die ein Argument (einen Parameter) importiert.
Versuchen wir's also einfach 'mal.

3. Erster Implementationsversuch mit for_each()


template <typename T>
void showVectorContent(const vector<T>& v)
{
 for_each(v.begin(),v.end(),/*???*/);
}

An die beiden Iteratoren first und last übergeben wir einfach den Anfangsiterator und den Endeiterator des Vektors.

Wie können wir aber an for_each() als dritten Parameter eine Funktion übergeben?

Nachdem eine halbe Stunde Herumstochern und "idiotische Compiler-Fehlermeldungen" uns nicht weitergebracht haben, besinnen wir uns auf das, was der Eichelsdörfer uns immer 'mal wieder "um die Ohren haut". Wir lesen und verwenden Papier, Bleistift und Radiergummi, statt nur auf der Tastatur herumzuhacken.

Nach zwei Tagen sind wir schlauer:
Was wir als dritten Parameter an for_each() übergeben müssen, ist ein Funktionsobjekt - whow!
Dazu finden wir in dem Buch von Kuhlins und Schader "Die C++ Standardbibliothek", 2. Auflage, Springer-Verlag:

Versuchen wir es zuerst mit einem Zeiger auf eine Funktion. Die einfachste Implementation verwendet einen Funktionsnamen als dritten Parameter.

4. Erste Implementation mit for_each()


void showInt(const int& value)
{cout << value << " ";}

template <typename T> void showVectorContent(const vector<T>& v) {  for_each(v.begin(),v.end(),showInt); }

Der dritte Parameter im Aufruf von for_each() ist showInt. Dieser Parameter ist die Anfangsadresse der Funktion showInt, also ein Zeiger auf showInt.

So funzt es, bleibt aber unbefriedigend.

Das ist selbstverständlich Blödsinn, auch wenn es in diesem Zusammenhang funktioniert.
Unser Funktionstemplate showVectorContent() soll mit jedem Elementtyp T arbeiten, im for_each()-Aufruf legen wir uns aber auf die Ausgabe von Integern fest.

Immerhin hat es der Compiler "gefressen". Zu mehr sind wir jetzt auch nicht mehr im Stande. Neuer Tag, neue Kraft, neues Glück.
... zur Fortsetzung