for_each() die Fünfte

Was war noch ein Funktionsobjekt?

Ein Funktionsobjekt ist ein Exemplar (Instanz) einer Klasse, die den Funktionsaufrufoperator () überlädt.

Das Überladen eines Operators kennen wir. Bauen wir also erst einmal ein Klassentemplate mit Namen showIt mit einer Elementfunktion doit(), welche die Ausgabe durchführt - also das, was wir eigentlich wollen.

template <typename T>
class showIt
{
 public:
  void doit(const T& value) const
  {cout << value << ' ' << flush;}
};

Jetzt, wo wir wissen, wie unsere tu-es-Funktion (doit) aussieht, wandeln wir sie einfach in den überladenen Aufrufoperator () um. Dazu ersetzen wir doit durch operator().

template <typename T>
class showIt
{
 public:
  void operator()(const T& value) const
  {cout << value << ' ' << flush;}
};
Ein Exemplar (Instanz) aus diesem Klassentemplate ist ein Funktionsobjekt.
Aha! Und was können wir damit anfangen?

Wir setzen dieses Ding einfach im Aufruf von for_each() ein.

template <typename T>
void showVectorContent(const vector<T>& v)
{
 for_each(v.begin(),v.end(),showIt<T>());
}
Auf Grund des dritten Parameters beim Aufruf von for_each() geschieht folgendes:
  1. Es wird eine Instanz von showIt<T> erstellt, wozu der Standardkonstruktor aufgerufen wird, den hier der Compiler selbst erstellt.
  2. Als dritter Parameter wird die Startadresse des Operators () von showIt<T> an for_each() übergeben. Voilà!

Was tut eigentlich for_each() bei diesem Aufruf?
for_each() geht alle Iteratorwerte von v.begin() bis unmittelbar vor v.end() durch und ruft nach und nach die Operatorfunktion () von showIt auf. Bei jedem dieser Aufrufe wird der "Wert" des dereferenzierten Iterators als Parameter übergeben. Es werden so also nach und nach alle Elemente des Vektors an die Operatorfunktion () von showIt übergeben, welche die Werte ausgibt.

Check it out!
Die Ausgabe des Programms sieht wie die eines Webcounters aus, es ist aber der Inhalt des Verktors V1 in der main-Funktion am Anfang dieser kleinen Reihe.

Haben Sie noch Fragen?
Auf Fragen gehe ich im Unterricht ein. Diesem Zweck dient mein Unterricht unter Anderem.  cu ;-)
Es folgt der ganze Quelltext.