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 이후)
(C++20 이후 constexpr)

함수 템플릿 std::mem_fn 은 멤버에 대한 포인터를 위한 래퍼 객체를 생성하며, 이는 멤버 포인터 를 저장, 복사, 호출할 수 있습니다. std::mem_fn 을 호출할 때는 객체에 대한 참조와 포인터(스마트 포인터 포함) 모두 사용할 수 있습니다.

목차

매개변수

pm - 래핑될 멤버에 대한 포인터

반환값

std::mem_fn 는 다음과 같은 멤버들을 가지는 지정되지 않은 타입의 호출 래퍼 fn 을 반환합니다:

std::mem_fn 반환 타입

멤버 타입

type 정의
result_type (C++17에서 사용 중단됨) pm 이 멤버 함수 포인터인 경우 그 반환 타입, 멤버 객체 포인터에 대해서는 정의되지 않음
argument_type (C++17에서 사용 중단됨) T* , 가능한 cv 한정자를 가짐, pm 이 인수를 받지 않는 멤버 함수 포인터인 경우
first_argument_type (C++17에서 사용 중단됨) T* , pm 이 하나의 인수를 받는 멤버 함수 포인터인 경우
second_argument_type (C++17에서 사용 중단됨) T1 , pm T1 타입의 인수 하나를 받는 멤버 함수 포인터인 경우
(C++20 이전)

멤버 함수

template < class ... Args >

/* 아래 참조 */ operator ( ) ( Args && ... args ) /* cvref 한정자 */

noexcept ( /* 아래 참조 */ ) ;
(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++11)
함수 객체에 하나 이상의 인수를 바인딩함
(함수 템플릿)