名前空間
変種
操作

std::mem_fn

提供: cppreference.com
< cpp‎ | utility‎ | functional
 
 
ユーティリティライブラリ
汎用ユーティリティ
日付と時間
関数オブジェクト
書式化ライブラリ (C++20)
(C++11)
関係演算子 (C++20で非推奨)
整数比較関数
(C++20)
スワップと型操作
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
一般的な語彙の型
(C++11)
(C++17)
(C++17)
(C++17)
(C++17)

初等文字列変換
(C++17)
(C++17)
 
関数オブジェクト
関数ラッパー
(C++11)
mem_fn
(C++11)
関数の部分適用
(C++20)
(C++11)
関数呼び出し
(C++17)
恒等関数オブジェクト
(C++20)
参照ラッパー
(C++11)(C++11)
演算子ラッパー
否定子
(C++17)
検索子
制約付き比較子
古いバインダとアダプタ
(C++17未満)
(C++17未満)
(C++17未満)
(C++17未満)
(C++17未満)(C++17未満)(C++17未満)(C++17未満)
(C++20未満)
(C++20未満)
(C++17未満)(C++17未満)
(C++17未満)(C++17未満)

(C++17未満)
(C++17未満)(C++17未満)(C++17未満)(C++17未満)
(C++20未満)
(C++20未満)
 
ヘッダ <functional> で定義
template< class M, class T >
/*unspecified*/ mem_fn(M T::* pm);
(C++11以上)
(C++17未満)
template< class M, class T >
/*unspecified*/ mem_fn(M T::* pm) noexcept;
(C++17以上)
(C++20未満)
template< class M, class T >
constexpr /*unspecified*/ mem_fn(M T::* pm) noexcept;
(C++20以上)

関数テンプレート std::mem_fn は、メンバポインタを格納し、コピーし、呼び出すことができる、メンバポインタのためのラッパーオブジェクトを生成します。 std::mem_fn を呼び出すときはオブジェクトの参照とポインタ (スマートポインタも含む) のいずれも使用できます。

目次

[編集] 引数

pm - ラップされるメンバポインタ

[編集] 戻り値

std::mem_fn は以下のメンバを持つ未規定な型の呼び出しラッパーを返します。

std::mem_fn の戻り値の型

メンバ型

定義
result_type(C++17で非推奨) pm がメンバ関数ポインタの場合、 pm の戻り値の型。 メンバオブジェクトポインタの場合は定義されません
argument_type(C++17で非推奨) pm が引数を取らないメンバ関数ポインタの場合、 T* (cv 修飾されているかもしれません)
first_argument_type(C++17で非推奨) pm が引数を1個取るメンバ関数ポインタの場合、 T*
second_argument_type(C++17で非推奨) pmT1 型の引数を1個取るメンバ関数ポインタの場合、 T1
(C++20未満)

メンバ関数

template<class... Args>
/* see below */ operator()(Args&&... args);
(C++20未満)
template<class... Args>
constexpr /* see below */ operator()(Args&&... args);
(C++20以上)

fnpm へのポインタを渡した std::mem_fn の呼び出しによって返された呼び出しラッパーとします。 その場合、式 fn(t, a2, ..., aN)INVOKE(pm, t, a2, ..., aN) と同等です。 ただし INVOKECallable で定義されている操作です (そのため、 operator() の戻り値の型は std::result_of<decltype(pm)(Args&&...)>::type です)。

std::forward<Args>(args)... によって行われたかのように、 args 内の各引数は完全転送されます。

[編集]

メンバ関数およびメンバオブジェクトを格納および実行するために mem_fn を使用します。

#include <functional>
#include <iostream>
 
struct Foo {
    void display_greeting() {
        std::cout << "Hello, world.\n";
    }
    void display_number(int i) {
        std::cout << "number: " << i << '\n';
    }
    int data = 7;
};
 
int main() {
    Foo f;
 
    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';
}

出力:

Hello, world.
number: 42
data: 7

[編集] 欠陥報告

以下の動作変更欠陥報告は以前に発行された C++ 標準に遡って適用されました。

DR 適用先 発行時の動作 正しい動作
LWG 2048 C++11 unnecessary overloads provided removed

[編集] 関連項目

(C++11)
指定された関数呼び出しシグネチャを持つ任意の型の呼び出し可能なオブジェクトをラップします
(クラステンプレート) [edit]
(C++11)
関数オブジェクトに1つ以上の引数をバインドします
(関数テンプレート) [edit]