Zur Erinnerung:
Unser Prädikat ist ein Funktionsobjekt, dessen Aufrufoperator () einen Parameter importiert
und einen Wahrheitswert liefert.
In unserem Falle erhält der Aufrufoperator () den Parameter von find_if().
find_if() ruft wiederholt den Aufrufoperator () auf und übergibt ihm den
vom laufenden Iterator referenzierten Wert. Das sieht innerhalb von find_if()
etwa so aus:
while (Anfang!=Ende && !f(*Anfang)) ++Anfang;f ist das Prädikat, entsprechend ist f() der Aufrufoperator des Prädikats.
Was soll unser Prädikat eigentlich tun?
Der Aufrufoperator () unseres Prädikats soll dann true liefern, wenn der importierte Parameter zwischen zwei bestimmten Werten liegt, d.h. im Intervall [unten, oben]. Also sollte dieser Operator wie folgt aussehen:
|
Das T stellt den formalen Typ des erforderlichen Klassentemplates dar. Wo aber kriegen wir die Werte für unten und oben her? |
unten und oben sind (selbstverständlich?) gekapselte Variablen des zu erstellenden Prädikats.
|
Die Ableitung von unary_function<T,bool> stellt sicher, dass im Zusammenhang mit dem Aufrufoperator () von imBereich die Typnamen argument_type (=T) und result_type (=bool) existieren. Der Aufrufoperator könnte auch so beschrieben werden: result_type operator() (argument_type value) const |
Na wo schon? Vom Konstruktor natürlich!
Also bauen wir den Konstruktor passend dazu!
|
Der Konstruktor initialisiert die gekapselten Variablen. Der Aufrufoperator() verwendet die Werte dieser Variablen. |
Und wie das Ganze funktioniert ist auf der nächsten Seite beschrieben.