Namensräume
Varianten
Aktionen

std::mem_fn

Von cppreference.com
< cpp‎ | utility‎ | functional
 
 
Dienstprogramm-Bibliotheken
Sprachunterstützung
Typunterstützung (Basistypen, RTTI)
Bibliotheks-Feature-Test-Makros (C++20)
Programm-Dienstprogramme
Variadische Funktionen
Coroutine-Unterstützung (C++20)
Vertragsunterstützung (C++26)
Drei-Wege-Vergleich
(C++20)
(C++20)(C++20)(C++20)  
(C++20)(C++20)(C++20)

Allgemeine Hilfsmittel
Relationale Operatoren (in C++20 veraltet)
 
Funktionsobjekte
Funktionsaufruf
(C++17)(C++23)
Identitätsfunktions-Objekt
(C++20)
Transparente Operator-Wrapper
(C++14)
(C++14)
(C++14)
(C++14)  
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)

Alte Binder und Adaptoren
(bis C++17*)
(bis C++17*)
(bis C++17*)
(bis C++17*)
(bis C++17*)(bis C++17*)(bis C++17*)(bis C++17*)
(bis C++20*)
(bis C++20*)
(bis C++17*)(bis C++17*)
(bis C++17*)(bis C++17*)

(bis C++17*)
(bis C++17*)(bis C++17*)(bis C++17*)(bis C++17*)
(bis C++20*)
(bis C++20*)
 
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

type Definition
result_type(in C++17 veraltet) der Rückgabetyp von pm, wenn pm ein Member-Funktionszeiger ist, nicht definiert für Member-Objektzeiger
argument_type(in C++17 veraltet) T*, möglicherweise cv-qualifiziert, wenn pm ein Member-Funktionszeiger ohne Argumente ist
first_argument_type(in C++17 veraltet) T*, wenn pm ein Member-Funktionszeiger mit einem Argument ist
second_argument_type(in C++17 veraltet) T1, wenn pm ein Member-Funktionszeiger mit einem Argument vom Typ T1 ist
(bis C++20)

Member-Funktion

template< class... Args >

/* siehe unten */ operator()(Args&&... args) /* cvref-qualifiers */

    noexcept(/* siehe unten */);
(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) [bearbeiten]
Move-only-Wrapper für jedes aufrufbare Objekt, das Qualifizierer in einer gegebenen Aufrufsignatur unterstützt
(Klassen-Template) [bearbeiten]
(C++11)
bindet ein oder mehrere Argumente an ein Funktions-Objekt
(Funktions-Template) [bearbeiten]