Ich habe eine C ++ - Klasse, in der ich versuche, std :: bind1st zu verwenden, um eine Memberfunktion an den Parameter 'this' zu binden. Zum Beispiel:
%Vor%Wenn ich die letzte 'bind1st'-Zeile hinzufüge, erhalte ich die folgenden Compiler-Fehler:
%Vor%Ich verwende STLPort v5.2.1 für eine Standardbibliotheksimplementierung.
Normalerweise würde ich zu boost :: bind wechseln und das verwenden. Leider ist das keine Möglichkeit für diese Anwendung.
Was kann ich tun, um die gewünschte Funktionalität zu erhalten?
Danke, PaulH
Bearbeiten:
Um klarer zu sein, suche ich nach einer Möglichkeit, eine unäre Funktion an eine Funktion anzupassen, die man als Funktion bezeichnet, die keine Parameter benötigt. Ich möchte this
an MyClass::Bar
binden.
Was versuchst du mit bind1st zu erreichen?
Die Funktion bind1st
nimmt eine binäre Funktion und passt sie an eine unäre Funktion an, indem sie das erste Argument implizit macht (dies ist möglicherweise nicht die beste Beschreibung, sorry). Der Rückgabewert von mem_fun
ist eine unäre Funktion.
Die Funktion mem_fun
gibt einen Adapter für eine Elementfunktion zurück. Die angepasste Funktion nimmt keine Argumente an, obwohl der zurückgegebene Adapter ein Argument, einen Zeiger auf das MyClass-Objekt, verwendet.
Im Grunde gibt Ihr Aufruf mem_fun
einen Adapter zurück, der ein Argument akzeptiert, aber bind1st
erwartet einen Adapter, der zwei Argumente akzeptiert. Es gibt ein mem_fun1
, das einen Adapter zurückgibt, der zwei Argumente akzeptiert, wobei der erste der Objektzeiger und der zweite ein Argument für die Funktion ist, aber das ist nicht das, was Sie hier wollen.
Tatsächlich verstehe ich nicht ganz, was Sie zu tun versuchen; Warum ist die Plain mem_fun
version nicht geeignet? Wenn Sie möchten, dass der Objektzeiger an den Adapter "angehängt" wird, kann das mit der aktuellen Standardbibliothek nicht gemacht werden, es sei denn, Sie verwenden bind.
Natürlich könnten Sie eine Wrapper-Klasse erstellen, die den Objektzeiger enthält, und dann einfach operator () definieren, um den Adapter mit diesem Objekt aufzurufen.
%Vor% bind1st
benötigt eine binäre Funktion und gibt einen unären Funktor zurück. Hier übergeben Sie eine unäre Funktion.
Der Zweck von "binding" besteht darin, eine binäre Funktion / einen Funktor (wie eine nicht statische Methode mit einem Parameter) wie einen unären zu verwenden, indem Sie einen seiner Parameter auf einen bestimmten Wert setzen.
Dies würde funktionieren (beachten Sie den neuen Prototyp von Bar
):
Ich wollte eine andere mögliche Lösung hinzufügen, die Lambda-Funktionen aus C ++ 11 verwendet.
Hier ist ein kurzes Beispiel:
%Vor%Ausgabe: "Mein Name ist Ismael."
Ich glaube, es funktioniert nicht, weil bind1st()
ein binäres Funktionsobjekt erfordert und ein unäres Funktionsobjekt zurückgibt. Da Bar()
keine Argumente annimmt, gibt mem_fun()
Ihnen ein unäres Funktionsobjekt. bind1st()
weiß nicht, was damit zu tun ist.
Wie wollen Sie eigentlich das von mem_fun()
erzeugte Funktionsobjekt verwenden?