std::mem_fun
ist veraltet. std::mem_fn
kann alles tun, was es tut, und es macht es bequemer. Die Beziehung zwischen den beiden ist die gleiche wie die Beziehung zwischen std::bind1st
/std::bind2nd
und der C++ 11 std::bind
. Sowohl std::mem_fn
als auch std::bind
wurden entwickelt und gemeistert, nachdem std::bind1st
und in den C++ 98 Standard aufgenommen wurden. Das bedeutet, dass wir bis C++ 11 warten mussten, um die alten Sachen durch die überlegenen Alternativen zu ersetzen.
Zum Beispiel std::mem_fun
kann nur mit Member-Funktionen, die ein oder kein Argument zu übernehmen. std::mem_fn
ist variabel und kann mit Mitgliedern umgehen, die eine beliebige Anzahl von Argumenten annehmen.
Sie müssen auch zwischen und std::mem_fun_ref
auswählen, je nachdem, ob Sie mit Zeigern oder Referenzen für das Klassenobjekt arbeiten wollen. std::mem_fn
allein kann mit beiden umgehen und bietet sogar Unterstützung für Smartpointer.
Die Dokumentation von boost::mem_fn
erklärt, wenn std::mem_fun
zu verwenden, und setzen Sie einfach das ist, wenn Sie mit dem Code arbeiten müssen, die std::mem_fun
erwartet, oder dass erwartet anpassungsfähig functors (was ein veralteter Begriff ist * von C++ 03). Für diese Fälle könnten Sie std::mem_fn
entweder nicht anschließen, also haben Sie es: Sie würden std::mem_fun
für Legacy verwenden.
*: Ich meine damit, dass neuer Code nicht auf das C++ 03-Protokoll angewiesen sein sollte, z.B. result_type
Mitgliedstypen (es ist üblicher, die neuen Eigenschaften wie std::result_of
zu verwenden) - die neuen Einrichtungen wie std::bind
/std::mem_fn
stellen tatsächlich diese Mitglieder zur Verfügung, wenn sie in gleichwertigem C++ 03-Code vorhanden gewesen wären. Ich überlasse es Ihnen, herauszufinden, ob Sie alten Code aktualisieren sollten, der auf anpassungsfähige Funktoren mit std::mem_fn
beruht, indem Sie sich auf dieses Verhalten verlassen.
'std :: not1' und' std :: not2' erwarten immer noch diese "anpassungsfähigen" typedefs. – Cubbi
@Cubbi: Sind das die einzigen Teile von C++ 11, die noch funktionieren? – Scotty
@Scotty soweit ich gesehen habe, ja, die einzigen nicht veralteten Teile. Und es gibt 25 Möglichkeiten, Funktoren mit diesen Typdefinitionen zu erstellen, von 'std :: function' und' std :: mem_fn' nach 'std :: ref' und' std :: map :: value_comp'. – Cubbi