Verwendung von std :: ptr_fun für eine Memberfunktion

8

Betrachten Sie Folgendes:

%Vor%

Der obige Code kann den Effekt von is_odd() nicht negieren, da es sich um eine Memberfunktion handelt. Der Aufruf von std::ptr_fun() schlägt fehl.

Wie mache ich es zum Arbeiten? Bitte beachten Sie, dass is_odd() eine nicht statische Elementfunktion sein soll.

    
CinCout 17.12.2015, 10:49
quelle

2 Antworten

8

Es gibt mehrere Probleme bei der Verwendung von A::is_odd(int) als unäres Prädikat, insbesondere wenn es mit std::not1() verwendet werden muss:

  1. Ein Aufruf von A::is_odd(int) benötigt zwei Argumente: das implizite Objekt (" this ") und das sichtbare int -Argument.
  2. Es ist kein Funktionsobjekt, das argument_type und result_type definiert.

Wenn Sie diese Memberfunktion ordnungsgemäß als unäres Prädikat verwenden, müssen Sie zwei Schritte ausführen:

  1. Anpassen des Elementfunktionszeigers an ein geeignetes Funktionsobjekt, z. B. unter Verwendung einer std::mem_*fun -Funktion.
  2. Binden des ersten Arguments an ein passendes Objekt, wobei ein Nicht-C ++ 11-Compiler wahrscheinlich std::bind1st() .
  3. verwendet

Mit einem C ++ 11-Compiler sind die Dinge viel einfacher, weil std::bind() sich um beide kümmert. Angenommen, es wird von einem Mitglied von A verwendet:

%Vor%

Das Gleiche mit einem Pre-C ++ 11-Compiler ist etwas schwieriger. Die Verwendung in std::remove_if() würde etwa so aussehen:

%Vor%     
Dietmar Kühl 17.12.2015, 11:08
quelle
0

Machen Sie is_odd static, so dass kein impliziter Parameter this benötigt wird:

%Vor%

Es werden keine Elementvariablen oder andere Elementfunktionen verwendet.

    
John Zwinck 17.12.2015 10:53
quelle

Tags und Links