================ Funktionsobjekte [TOC] ================ Funktionsobjekte sind alle Objekte, die wie eine Funktion benutzt werden können. Dies schließt * reguläre Funktionen, * Template-Funktionen und * Objekte ein, deren Klasse einen Funktionsoperator aufweist. Mit Funktionsobjekten werden zahlreiche Algorithmen parametrisiert. Im folgenden Beispiel wird `std::copy_if` aus `#include ` genutzt, um mit Hilfe eines Prädikats bei einer mit Iteratoren spezifizierten Menge von Objekten eine Auswahl zu treffen: :import: session06/step01/select-even.cpp Ein paar Erläuterungen zu dem Beispiel: * Mit `std::iota` kann eine mit Iteratoren spezifizierte Menge von Objekten mit sukzessiven numerischen Werten gefüllt werden. Der dritte Parameter spezifiziert den ersten Wert, hier eine 2. Der Name _iota_ geht zurück auf einen entsprechend benannten Operator der Programmiersprache APL. Siehe https://stackoverflow.com/questions/9244879/what-does-iota-of-stdiota-stand-for Für `std::iota` wird `#include ` benötigt. * Mit `std::shuffle` kann eine durch Iteratoren spezifizierte Objektmenge pseudo-zufällig gemischt werden. Als Seed-Wert wird hier 1 verwendet, um die Ausgabe reproduzierbar zu halten. * Dann folgt die Auswahl m Hilfe von `std::copy_if`, wobei der vierte Parameter das Prädikat angibt. Ein Prädikat erhält ein Objekt (nicht einen Iterator!) und liefert dann einen `bool`-Wert zurück, um festzustellen, ob für das Objekt das Prädikat erfüllt ist oder nicht. In diesem Beispiel wird die ganz einfache reguläre Funktion `is_even` hierfür eingesetzt. Für `std::copy_if` wird der Header `` benötigt. * Die Ausgabe erfolgt in gleich weiten Spalten. Dies gelingt mit `std::setw`, das die vorgesehene Weite für die folgende numerische Ausgabe festlegt. Hierzu wird der Header `` benötigt. So sieht die Ausführung aus: ---- SHELL (path=session06/step01,hostname=theon) -------- g++ -Wall -o select-even select-even.cpp ./select-even ---------------------------------------------------------- Natürlich kann die Funktion auch durch eine Klasse mit einem passenden Funktionsoperator ersetzt werden: :import: session06/step01/select-even2.cpp [fold] ---- SHELL (path=session06/step01,hostname=theon) -------- diff -U 2 select-even.cpp select-even2.cpp g++ -Wall -o select-even2 select-even2.cpp ./select-even2 ---------------------------------------------------------- Das bringt hier zunächst nur etwas mehr Text. Aber auf Klassen basierende Funktionsobjekte haben einen Vorteil: Sie können einen Status verwalten und diesen in die Entscheidung einfließen lassen. Aufgabe ======= Ersetzen Sie die Prädikatsklasse `IsEven` durch ein Prädikat `Increasing`, das das erste Element immer akzeptiert und die weiteren nur dann, wenn sie monoton steigend sind. Vorlage ======= :import: session06/step01/select-even2.cpp [fold] :navigate: up -> doc:index next -> doc:session06/page02