2012-07-27 15 views
25

Was ist der Unterschied zwischen std :: mem_fun und std :: mem_fn? Warum ist die Benennung so verwirrend?std :: mem_fun vs std :: mem_fn

Boost's documentation sagt, dass std :: mem_fn std :: mem_fun in den meisten Fällen ersetzen kann. Also in welcher Situation würdest du noch std :: mem_fun benutzen?

Antwort

40

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.

+2

'std :: not1' und' std :: not2' erwarten immer noch diese "anpassungsfähigen" typedefs. – Cubbi

+0

@Cubbi: Sind das die einzigen Teile von C++ 11, die noch funktionieren? – Scotty

+1

@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

Verwandte Themen