std:: mem_fn
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Old binders and adaptors | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Definiert im Header
<functional>
|
||
|
template
<
class
M,
class
T
>
/* unspecified */ mem_fn ( M T :: * pm ) noexcept ; |
(seit C++11)
(constexpr seit C++20) |
|
Funktionsvorlage
std::mem_fn
erzeugt Wrapper-Objekte für Zeiger auf Elemente, die einen
Zeiger auf Element
speichern, kopieren und aufrufen können. Sowohl Referenzen als auch Zeiger (einschließlich intelligenter Zeiger) auf ein Objekt können beim Aufruf von
std::mem_fn
verwendet werden.
Inhaltsverzeichnis |
Parameter
| pm | - | Zeiger auf Element, das gekapselt werden soll |
Rückgabewert
std::mem_fn
gibt einen Aufruf-Wrapper
fn
eines nicht näher spezifizierten Typs zurück, der die folgenden Member besitzt:
std::mem_fn Rückgabetyp
Member-Typen
|
(bis C++20) |
Member-Funktion
|
template
<
class
...
Args
>
/* siehe unten */
operator
(
)
(
Args
&&
...
args
)
/* cvref-Qualifizierer */
|
(constexpr seit C++20) | |
Der Ausdruck
fn
(
args
)
ist äquivalent zu
INVOKE
(
pmd, args
)
, wobei
pmd
das von
fn
gehaltene
Callable
-Objekt ist, vom Typ
M T::*
und direkt-nicht-Listen-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 in der noexcept -Spezifikation ist gleich std:: is_nothrow_invocable_v < decltype ( pm ) , Args && ... > ) (seit C++17) .
Jedes Argument in args wird perfekt weitergeleitet, wie durch std:: forward < Args > ( args ) ... .
Beispiel
Verwenden Sie
std::mem_fn
, um eine Memberfunktion und ein Memberobjekt 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
Fehlerberichte
Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | Angewendet auf | Verhalten wie veröffentlicht | Korrektes Verhalten |
|---|---|---|---|
| LWG 2048 | C++11 | unnötige Überladungen bereitgestellt | entfernt |
| LWG 2489 | C++11 | noexcept nicht erforderlich | erforderlich |
Siehe auch
|
(C++11)
|
kopierbarer Wrapper für jedes kopierkonstruierbare aufrufbare Objekt
(Klassen-Template) |
|
(C++23)
|
Nur-verschiebbarer Wrapper für jedes aufrufbare Objekt, das Qualifier in einer gegebenen Aufrufsignatur unterstützt
(Klassen-Template) |
|
(C++11)
|
bindet ein oder mehrere Argumente an ein Funktionsobjekt
(Funktions-Template) |