šHgeocities.com/Vienna/Stage/4793/stl10.htmgeocities.com/Vienna/Stage/4793/stl10.htmdelayedxąÕJ’’’’’’’’’’’’’’’’’’’’ČpĖ£%OKtext/htmlĻBmo%’’’’b‰.HMon, 18 Dec 2000 15:43:53 GMTüMozilla/4.5 (compatible; HTTrack 3.0x; Windows 98)en, *ąÕJ% Binder

Zurück ] Nach oben ]

 

Binder, Adapter & Negierer

Da man speziell bei einigen Prädikaten einen der Parameter mit einer Konstanten  belegen möchte, stellt die Bibliothek sogenannte Binder zur Verfügung, die dies übernehmen. Ähnlich wie im obigen Beispiel die Funktion accumulate den ersten Parameter für plus<int> übergeben bekommen hat, kann man mit bind1st() und bind2nd() das erste Argument bzw. das zweite Argument einer binary_function mitgeben. Vergleiche wie "finde den Wert <7" sehen dann so aus:

   // finde das erste Element  < 7
   it = find_if( v.begin(),v.end(), bind2nd( less<int>(),7);
   // finde das 7 < dem erste Element
   it = find_if( v.begin(),v.end(), bind1st( less<int>(),7);

Dies funktioniert deswegen,  weil die Namen der Argument in den Funktionsobjekten standardisiert sind. Dieser Mechanismus wird auch Currying genannt.

Um die Möglichkeit auch Elementfunktionen (member_functions) eines Objektes in einem Algorithmus aufzurufen, statt nur  globale Funktionen, gibt es einige Funktionen, die Adapter genannt werden, die dies erlauben:

 // zeichne alle gespeicherten Zeiger auf Objekte(unär)
void alle_zeichnen( list<Form*>& ls)
{
  for_each(ls.begin(),ls.end(),mem_fun(&Form::zeichne));
}
// zeichne alle gespeicherten Objekte(unär)
void alle_zeichnen( list<Form>& ls)
{
  for_each(ls.begin(),ls.end(),mem_fun_ref(&Form::zeichne));
}

// rotiere alle Elemente (binär)
void rotate_all( list<Form*>& ls, int winkel)
{
   for_each(ls.begin(),ls.end(),bind2nd(mem_fun(&Form::rotiere),winkel);
}

Da die Algorithmen nur höchstens binäre Funktionen verwenden, macht es auch nur Sinn, Memberfunktionen mit höchstens einem Parameter zu übergeben.

Um noch flexibler zu sein, und auch normale Funktionen einem Binder mitzugeben, gibt es die Funktion ptr_fun, der man ähnlich wie beim Beispiel rotate_all eine binäre Funktion erwartet. Dies nennt man dann Funktionszeigeradapter.

Negierer erlauben es, wie es der Name schon sagt, das Prädikat zu negieren. Hierzu gibt es die Funktionen not1() (unär) und not2() (binär), die dies bewerkstelligen:

extern "C" int strcmp(const char*, const char*);     //aus stdlib(binär!)

void f( list<char*>& ls)
{
   typedef typename list<char*>::const_iterator ListIt;
   ListIt p = find_if(ls.begin(),ls.end(),
                                 not1(bind2nd(ptr_fun(strcmp),"lustig")));