2010-04-14 14 views
7

Angenommen, die folgenden zwei Funktionen:C++: Verbindung von Bindungen?

#include <iostream> 
#include <cstdlib> // atoi 
#include <cstring> // strcmp 
#include <boost/bind.hpp> 

bool match1(const char* a, const char* b) { 
    return (strcmp(a, b) == 0); 
} 

bool match2(int a, const char* b) { 
    return (atoi(b) == a); 
} 

Jede dieser Funktionen zwei Argumente, kann aber in einen aufrufbaren Objekt transformiert werden, die unter Verwendung (std/boost) bind nur ein Argument annimmt. Etwas entlang der Linien von:

boost::bind(match1, "a test"); 
boost::bind(match2, 42); 

ich in der Lage sein wollen, erhalten von zwei Funktionen wie diese, die ein Argument nehmen und zurück bool, eine aufrufbare Objekt, das zwei Argumente nimmt und gibt den & & der bool s. Der Typ der Argumente ist beliebig.

So etwas wie ein operator&& für Funktionen, die bool zurückgeben.

+0

Willst du keine Funktion, die ein Argument und ein Bool zurückgibt? Dh äquivalent zu 'match1 (" ein Test ", X) && match2 (42, X)'? oder willst du wirklich 'match1 (" ein test ", X) && match2 (42, Y)'? –

+0

Ich möchte wirklich eine Funktion, die zwei Argumente braucht. –

Antwort

9

Der Rückgabetyp von boost::bind überlastet operator && (sowie many others). So können Sie

boost::bind(match1, "a test", _1) && boost::bind(match2, 42, _2); 

schreiben Wenn Sie diesen Wert speichern möchten, verwenden Sie boost::function. In diesem Fall würde der Typ

boost::function<bool(const char *, const char *)> 

Hinweis sein, dass dies nicht der Rückgabetyp von boost::bind ist (dh nicht spezifiziert), aber jeder Funktors mit der richtigen Signatur ist umwandelbar in ein boost::function.

+0

@sth, bearbeitet, guter Vorschlag –

+0

Kann ich eine Funktion haben, die etwas vom Typ 'boost: bind' zurückgibt? –

+1

@Helltone, gute Frage - siehe meine Bearbeitung –