Das Prädikat

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:


bool operator()(const T& value) const
{return unten<=value && value<=oben;}
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.

template <typename T>
class imBereich
 : public unary_function<const T&,bool>
{
 public:
  bool operator()(const T& value) const
  {return unten<=value && value<=oben;}
 private:
  T unten, oben;
};

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

Und wo kriegen die beiden Variablen ihre Werte her?

Na wo schon? Vom Konstruktor natürlich!
Also bauen wir den Konstruktor passend dazu!

template <typename T>
class imBereich : public unary_function<T,bool>
{
 public:
  imBereich(T u, T o) : unten(u), oben(o)
  {}
  bool operator()(const T& value) const
  {return unten<=value && value<=oben;}
 private:
  T unten, oben;
};

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.