std:: mem_fn
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Old binders and adaptors | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
헤더에 정의됨
<functional>
|
||
|
template
<
class
M,
class
T
>
/* unspecified */ mem_fn ( M T :: * pm ) noexcept ; |
(C++11 이후)
(C++20 이후 constexpr) |
|
함수 템플릿
std::mem_fn
은 멤버에 대한 포인터를 위한 래퍼 객체를 생성하며, 이는
멤버 포인터
를 저장, 복사, 호출할 수 있습니다.
std::mem_fn
을 호출할 때는 객체에 대한 참조와 포인터(스마트 포인터 포함) 모두 사용할 수 있습니다.
목차 |
매개변수
| pm | - | 래핑될 멤버에 대한 포인터 |
반환값
std::mem_fn
는 다음과 같은 멤버들을 가지는 지정되지 않은 타입의 호출 래퍼
fn
을 반환합니다:
std::mem_fn 반환 타입
멤버 타입
|
(C++20 이전) |
멤버 함수
|
template
<
class
...
Args
>
/* 아래 참조 */
operator
(
)
(
Args
&&
...
args
)
/* cvref 한정자 */
|
(C++20부터 constexpr) | |
표현식
fn
(
args
)
은
INVOKE
(
pmd, args
)
와 동등하며, 여기서
pmd
는
fn
이 보유한
Callable
객체로, 타입은
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 && ... > ) 과 같습니다. (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 | 적용 대상 | 게시된 동작 | 올바른 동작 |
|---|---|---|---|
| LWG 2048 | C++11 | 불필요한 오버로드 제공됨 | 제거됨 |
| LWG 2489 | C++11 | noexcept 불필요 | 필요 |
참고 항목
|
(C++11)
|
복사 생성 가능한 모든 호출 가능 객체의 복사 가능 래퍼
(클래스 템플릿) |
|
(C++23)
|
주어진 호출 시그니처에서 한정자를 지원하는 모든 호출 가능 객체의 이동 전용 래퍼
(클래스 템플릿) |
|
(C++11)
|
함수 객체에 하나 이상의 인수를 바인딩함
(함수 템플릿) |