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* )
Определено в заголовке <functional>
template < class M, class T >
/* unspecified */ mem_fn ( M T :: * pm ) noexcept ;
(начиная с C++11)
(constexpr начиная с C++20)

Шаблон функции std::mem_fn генерирует объекты-обёртки для указателей на члены, которые могут хранить, копировать и вызывать указатель на член . Как ссылки, так и указатели (включая интеллектуальные указатели) на объект могут использоваться при вызове std::mem_fn .

Содержание

Параметры

pm - указатель на член, который будет обёрнут

Возвращаемое значение

std::mem_fn возвращает обёртку вызова fn неопределённого типа, которая имеет следующие члены:

std::mem_fn return type

Member types

type definition
result_type (deprecated in C++17) тип возвращаемого значения pm , если pm является указателем на функцию-член, не определен для указателя на член-объект
argument_type (deprecated in C++17) T* , возможно с cv-квалификаторами, если pm является указателем на функцию-член без аргументов
first_argument_type (deprecated in C++17) T* , если pm является указателем на функцию-член с одним аргументом
second_argument_type (deprecated in C++17) T1 , если pm является указателем на функцию-член с одним аргументом типа T1
(до C++20)

Member function

template < class ... Args >

/* see below */ operator ( ) ( Args && ... args ) /* cvref-qualifiers */

noexcept ( /* see below */ ) ;
(constexpr since C++20)

Выражение fn ( args ) эквивалентно INVOKE ( pmd, args ) , где pmd является Callable объектом, хранимым в fn , имеет тип M T::* и прямо несписочно инициализируется с pm .

Таким образом, тип возвращаемого значения operator ( ) равен std:: result_of < decltype ( pm ) ( Args && ... ) > :: type или эквивалентно std:: invoke_result_t < decltype ( pm ) , Args && ... > , а значение в спецификаторе noexcept равно std:: is_nothrow_invocable_v < decltype ( pm ) , Args && ... > ) (since C++17) .

Каждый аргумент в args идеально перенаправляется, как если бы с помощью std:: forward < Args > ( args ) ... .

Пример

Используйте std::mem_fn для сохранения и выполнения функции-члена и объекта-члена:

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

Вывод:

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

Отчеты о дефектах

Следующие отчеты об изменениях в поведении, содержащие описания дефектов, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Applied to Behavior as published Correct behavior
LWG 2048 C++11 unnecessary overloads provided removed
LWG 2489 C++11 noexcept not required required

Смотрите также

(C++11)
копируемая обёртка для любого копируемого вызываемого объекта
(шаблон класса)
перемещаемая обёртка для любого вызываемого объекта, поддерживающего квалификаторы в заданной сигнатуре вызова
(шаблон класса)
(C++11)
привязывает один или несколько аргументов к функциональному объекту
(шаблон функции)