名前空間
変種
操作

std::mem_fn

提供: cppreference.com
< cpp‎ | utility‎ | functional
 
 
 
関数オブジェクト
関数ラッパー
(C++11)
mem_fn
(C++11)
バインド
(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);
(1) (C++11およびそれ以降)
template< class R, class T, class... Args >

/*unspecified*/ mem_fn(R (T::* pm)(Args...));
template< class R, class T, class... Args >
/*unspecified*/ mem_fn(R (T::* pm)(Args...) const);
template< class R, class T, class... Args >
/*unspecified*/ mem_fn(R (T::* pm)(Args...) volatile);
template< class R, class T, class... Args >
/*unspecified*/ mem_fn(R (T::* pm)(Args...) const volatile);
template< class R, class T, class... Args >
/*unspecified*/ mem_fn(R (T::* pm)(Args...) &);
template< class R, class T, class... Args >
/*unspecified*/ mem_fn(R (T::* pm)(Args...) const &);
template< class R, class T, class... Args >
/*unspecified*/ mem_fn(R (T::* pm)(Args...) volatile &);
template< class R, class T, class... Args >
/*unspecified*/ mem_fn(R (T::* pm)(Args...) const volatile &);
template< class R, class T, class... Args >
/*unspecified*/ mem_fn(R (T::* pm)(Args...) &&);
template< class R, class T, class... Args >
/*unspecified*/ mem_fn(R (T::* pm)(Args...) const &&);
template< class R, class T, class... Args >
/*unspecified*/ mem_fn(R (T::* pm)(Args...) volatile &&);
template< class R, class T, class... Args >

/*unspecified*/ mem_fn(R (T::* pm)(Args...) const volatile &&);
(2) (C++11およびそれ以降)
(C++14で削除)

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

オーバーロード (2) は C++11 で導入されましたが、 C++14 で defect #2048 として削除されました。

目次

[編集] 引数

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);

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 内の各引数は完全転送されます。

[編集] 例外

(なし)

(C++17以前)
noexcept 指定:  
noexcept
  
(C++17およびそれ以降)

[編集] 例1

メンバ関数およびメンバオブジェクトを格納および実行するために 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

[編集] 例2

std::mem_fn の仕様に対する C++14 の変更の効果をデモンストレーションします。

#include <iostream>
#include <functional>
 
struct X {
    int x;
 
    int&       easy()      {return x;}
    int&       get()       {return x;}
    const int& get() const {return x;}
};
 
 
int main(void)
{
    auto a = std::mem_fn        (&X::easy); // no problem at all
//  auto b = std::mem_fn<int&  >(&X::get ); // no longer works in C++14
    auto c = std::mem_fn<int&()>(&X::get ); // works with both C++11 and C++14
    auto d = [] (X& x) {return x.get();};   // another approach to overload resolution
 
    X x = {33};
    std::cout << "a() = " << a(x) << '\n';
    std::cout << "c() = " << c(x) << '\n';
    std::cout << "d() = " << d(x) << '\n';
}

出力:

a() = 33
c() = 33
d() = 33

[編集] 関連項目

(C++11)
指定された関数呼び出しシグネチャを持つ任意の型の呼び出し可能オブジェクトをラップします
Original:
wraps callable object of any type with specified function call signature
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.

(クラステンプレート) [edit]
(C++11)
関数オブジェクトに1つ以上の引数をバインドします
(関数テンプレート) [edit]