std::mem_fn
| Definiert in der Header-Datei <functional> |
||
| template< class M, class T > /* nicht spezifiziert */ mem_fn( M T::* pm ) noexcept; |
(seit C++11) (constexpr seit C++20) |
|
Die Funktionstemplate std::mem_fn generiert Wrapper-Objekte für Member-Zeiger, die einen Member-Zeiger speichern, kopieren und aufrufen können. Sowohl Referenzen als auch Zeiger (einschließlich Smart Pointers) auf ein Objekt können beim Aufrufen von std::mem_fn verwendet werden.
Inhalt |
[bearbeiten] Parameter
| pm | - | Member-Zeiger, der verpackt werden soll |
[bearbeiten] Rückgabewert
std::mem_fn gibt einen Aufruf-Wrapper fn von nicht spezifiziertem Typ zurück, der die folgenden Member hat
std::mem_fn Rückgabetyp
Membertypen
|
(bis C++20) |
Member-Funktion
template< class... Args > /* siehe unten */ operator()(Args&&... args) /* cvref-qualifiers */ |
(constexpr seit C++20) | |
Der Ausdruck fn(args) ist äquivalent zu INVOKE(pmd, args), wobei pmd das Callable-Objekt ist, das von fn gehalten wird. Es hat den Typ M T::* und wird direkt-non-list-initialisiert mit pm.
Somit ist der Rückgabetyp von operator() std::result_of<decltype(pm)(Args&&...)>::type oder äquivalent std::invoke_result_t<decltype(pm), Args&&...), und der Wert im noexcept-Spezifizierer ist gleich std::is_nothrow_invocable_v<decltype(pm), Args&&...))(seit C++17).
Jedes Argument in args wird perfekt weitergeleitet, als ob durch std::forward<Args>(args)....
[bearbeiten] Beispiel
Verwenden Sie std::mem_fn, um eine Member-Funktion und ein Member-Objekt zu speichern und auszuführen
#include <functional> #include <iostream> #include <memory> struct Foo { void display_greeting() { std::cout << "Hello, world.\n"; } void display_number(int i) { std::cout << "number: " << i << '\n'; } int add_xy(int x, int y) { return data + x + y; } template<typename... Args> int add_many(Args... args) { return data + (args + ...); } auto add_them(auto... args) // C++20 required { return data + (args + ...); } int data = 7; }; int main() { auto f = Foo{}; auto greet = std::mem_fn(&Foo::display_greeting); greet(f); auto print_num = std::mem_fn(&Foo::display_number); print_num(f, 42); auto access_data = std::mem_fn(&Foo::data); std::cout << "data: " << access_data(f) << '\n'; auto add_xy = std::mem_fn(&Foo::add_xy); std::cout << "add_xy: " << add_xy(f, 1, 2) << '\n'; auto u = std::make_unique<Foo>(); std::cout << "access_data(u): " << access_data(u) << '\n'; std::cout << "add_xy(u, 1, 2): " << add_xy(u, 1, 2) << '\n'; auto add_many = std::mem_fn(&Foo::add_many<short, int, long>); std::cout << "add_many(u, ...): " << add_many(u, 1, 2, 3) << '\n'; auto add_them = std::mem_fn(&Foo::add_them<short, int, float, double>); std::cout << "add_them(u, ...): " << add_them(u, 5, 7, 10.0f, 13.0) << '\n'; }
Ausgabe
Hello, world. number: 42 data: 7 add_xy: 10 access_data(u): 7 add_xy(u, 1, 2): 10 add_many(u, ...): 13 add_them(u, ...): 42
[bearbeiten] Defect Reports
Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| LWG 2048 | C++11 | unnötige Überladungen bereitgestellt | entfernt |
| LWG 2489 | C++11 | noexcept nicht erforderlich | Gefordert |
[bearbeiten] Siehe auch
| (C++11) |
kopierfähiger Wrapper für jedes kopierkonstruierbare aufrufbare Objekt (Klassen-Template) |
| (C++23) |
Move-only-Wrapper für jedes aufrufbare Objekt, das Qualifizierer in einer gegebenen Aufrufsignatur unterstützt (Klassen-Template) |
| (C++11) |
bindet ein oder mehrere Argumente an ein Funktions-Objekt (Funktions-Template) |