std:: mem_fn
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Old binders and adaptors | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Определено в заголовке
<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
|
(до C++20) |
Member function
|
template
<
class
...
Args
>
/* see below */
operator
(
)
(
Args
&&
...
args
)
/* cvref-qualifiers */
|
(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++23)
|
перемещаемая обёртка для любого вызываемого объекта, поддерживающего квалификаторы в заданной сигнатуре вызова
(шаблон класса) |
|
(C++11)
|
привязывает один или несколько аргументов к функциональному объекту
(шаблон функции) |