Namespaces
Variants

std:: mem_fn

From cppreference.net
Utilities library
Function objects
Function invocation
(C++17) (C++23)
Identity function object
(C++20)
Old binders and adaptors
( until C++17* )
( until C++17* )
( until C++17* )
( until C++17* )
( until C++17* ) ( until C++17* ) ( until C++17* ) ( until C++17* )
( until C++20* )
( until C++20* )
( until C++17* ) ( until C++17* )
( until C++17* ) ( until C++17* )

( until C++17* )
( until C++17* ) ( until C++17* ) ( until C++17* ) ( until C++17* )
( until C++20* )
( until C++20* )
Definido en el encabezado <functional>
template < class M, class T >
/* no especificado */ mem_fn ( M T :: * pm ) noexcept ;
(desde C++11)
(constexpr desde C++20)

La plantilla de función std::mem_fn genera objetos envoltorio para punteros a miembros, que pueden almacenar, copiar e invocar un puntero a miembro . Tanto referencias como punteros (incluyendo punteros inteligentes) a un objeto pueden ser utilizados al invocar un std::mem_fn .

Contenidos

Parámetros

pm - puntero a miembro que será encapsulado

Valor de retorno

std::mem_fn devuelve un envoltorio de llamada fn de tipo no especificado que tiene los siguientes miembros:

std::mem_fn tipo de retorno

Tipos miembro

type definición
result_type (obsoleto en C++17) el tipo de retorno de pm si pm es un puntero a función miembro, no definido para puntero a objeto miembro
argument_type (obsoleto en C++17) T* , posiblemente calificado cv, si pm es un puntero a función miembro que no toma argumentos
first_argument_type (obsoleto en C++17) T* si pm es un puntero a función miembro que toma un argumento
second_argument_type (obsoleto en C++17) T1 si pm es un puntero a función miembro que toma un argumento de tipo T1
(hasta C++20)

Función miembro

template < class ... Args >

/* ver abajo */ operator ( ) ( Args && ... args ) /* calificadores cvref */

noexcept ( /* ver abajo */ ) ;
(constexpr desde C++20)

La expresión fn ( args ) es equivalente a INVOKE ( pmd, args ) , donde pmd es el objeto Callable contenido en fn , es de tipo M T::* y está inicializado con inicialización directa-no-lista con pm .

Por lo tanto, el tipo de retorno de operator ( ) es std:: result_of < decltype ( pm ) ( Args && ... ) > :: type o equivalentemente std:: invoke_result_t < decltype ( pm ) , Args && ... > , y el valor en el especificador noexcept es igual a std:: is_nothrow_invocable_v < decltype ( pm ) , Args && ... > ) (desde C++17) .

Cada argumento en args es perfectamente reenviado, como si fuera mediante std:: forward < Args > ( args ) ... .

Ejemplo

Utilice std::mem_fn para almacenar y ejecutar una función miembro y un objeto miembro:

#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';
}

Salida:

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

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 2048 C++11 se proporcionaron sobrecargas innecesarias eliminadas
LWG 2489 C++11 noexcept no requerido requerido

Véase también

(C++11)
envoltorio copiable de cualquier objeto invocable copiable
(plantilla de clase)
envoltorio no copiable de cualquier objeto invocable que soporta calificadores en una firma de llamada dada
(plantilla de clase)
(C++11)
vincula uno o más argumentos a un objeto función
(plantilla de función)