std::mem_fn
提供: cppreference.com
<tbody>
</tbody>
| ヘッダ <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未満) |
メンバ関数
<tbody> </tbody> <tbody class="t-dcl-rev "> </tbody><tbody> </tbody> 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つ以上の引数をバインドします (関数テンプレート) |