referenziert eine Member-Funktion mit bind1st und mem_fun

8

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.

%Vor%     
PaulH 03.08.2010, 18:50
quelle

4 Antworten

5

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%     
Collin Dauphinee 03.08.2010, 19:15
quelle
4

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 ):

%Vor%     
KeatsPeeks 03.08.2010 19:16
quelle
1

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."

    
Justin Arruda 04.09.2013 13:09
quelle
0

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?

    
Fred Larson 03.08.2010 19:08
quelle

Tags und Links