std::mem_fn
提供: cppreference.com
< cpp | utility | functional
ヘッダ <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 の戻り値の型
メンバ型
|
(C++20未満) |
メンバ関数
template<class... Args> /* see below */ operator()(Args&&... args); |
(C++20未満) | |
template<class... Args> constexpr /* see below */ operator()(Args&&... args); |
(C++20以上) | |
fn
を pm
へのポインタを渡した std::mem_fn
の呼び出しによって返された呼び出しラッパーとします。 その場合、式 fn(t, a2, ..., aN) は INVOKE(pm, t, a2, ..., aN) と同等です。 ただし INVOKE は Callable で定義されている操作です (そのため、 operator()
の戻り値の型は std::result_of<decltype(pm)(Args&&...)>::type です)。
std::forward<Args>(args)... によって行われたかのように、 args
内の各引数は完全転送されます。
[編集] 例
メンバ関数およびメンバオブジェクトを格納および実行するために mem_fn
を使用します。
Run this code
#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) |
指定された関数呼び出しシグネチャを持つ任意の型の呼び出し可能なオブジェクトをラップします (クラステンプレート) |
(C++11) |
関数オブジェクトに1つ以上の引数をバインドします (関数テンプレート) |