std::function
提供: cppreference.com
< cpp | utility | functional
ヘッダ <functional> で定義
|
||
template< class > class function; /* undefined */ |
(C++11以上) | |
template< class R, class... Args > class function<R(Args...)>; |
(C++11以上) | |
クラステンプレート std::function
は汎用の多相的な関数ラッパーです。 std::function
のインスタンスは任意の Callable なターゲット ーー 関数、ラムダ式、バインド式、その他の関数オブジェクト、さらにメンバ関数ポインタやデータメンバポインタも格納することができ、コピーしたり、呼び出したりできます。
格納された呼び出し可能なオブジェクトは std::function
のターゲットと言います。 std::function
にターゲットが格納されていない場合、それは空であると言います。 空の std::function
のターゲットを呼び出すと、例外 std::bad_function_call が投げられます。
std::function
は CopyConstructible および CopyAssignable の要件を満たします。
目次 |
[編集] メンバ型
型 | 定義 |
result_type
|
R
|
argument_type (C++17で非推奨)(C++20で削除)
|
sizeof...(Args)==1 であり、 T が Args... の最初かつ唯一の型の場合、 T
|
first_argument_type (C++17で非推奨)(C++20で削除)
|
sizeof...(Args)==2 であり、 T1 が Args... の2つの型の1つめの場合、 T1
|
second_argument_type (C++17で非推奨)(C++20で削除)
|
sizeof...(Args)==2 であり、 T2 が Args... の2つの型の2つめの場合、 T2
|
[編集] メンバ関数
新しい std::function のインスタンスを構築します (パブリックメンバ関数) | |
std::function のインスタンスを破棄します (パブリックメンバ関数) | |
新しいターゲットを代入します (パブリックメンバ関数) | |
内容を入れ替えます (パブリックメンバ関数) | |
(C++17で削除) |
新しいターゲットを代入します (パブリックメンバ関数) |
有効なターゲットが格納されているかどうか調べます (パブリックメンバ関数) | |
ターゲットを呼び出します (パブリックメンバ関数) | |
ターゲットのアクセス | |
格納されているターゲットの typeid を取得します (パブリックメンバ関数) | |
格納されているターゲットを指すポインタを返します (パブリックメンバ関数) |
[編集] 非メンバ関数
(C++11) |
std::swap アルゴリズムの特殊化 (関数テンプレート) |
(C++20で削除) |
std::function を nullptr と比較します (関数テンプレート) |
[編集] ヘルパークラス
(C++11) (C++17未満) |
std::uses_allocator 型特性の特殊化 (クラステンプレートの特殊化) |
[編集] 推定ガイド(C++17以上)
[編集] ノート
後置戻り値型なしのラムダ式から、戻り値の型が参照である std::function
を初期化するときは、注意が必要です。 auto の推定の仕様により、そのようなラムダ式は prvalue を返します。 そのため、戻り値の参照は、通常、 std::function::operator()
が戻るときに生存期間が終わる一時オブジェクトに束縛されます。
std::function<const int&()> f([]{ return 42; }); int x = f(); // 未定義動作。 f() の戻り値はダングリング参照です。
[編集] 例
Run this code
#include <functional> #include <iostream> struct Foo { Foo(int num) : num_(num) {} void print_add(int i) const { std::cout << num_+i << '\n'; } int num_; }; void print_num(int i) { std::cout << i << '\n'; } struct PrintNum { void operator()(int i) const { std::cout << i << '\n'; } }; int main() { // 自由関数を格納します。 std::function<void(int)> f_display = print_num; f_display(-9); // ラムダを格納します。 std::function<void()> f_display_42 = []() { print_num(42); }; f_display_42(); // std::bind の呼び出しの結果を格納します。 std::function<void()> f_display_31337 = std::bind(print_num, 31337); f_display_31337(); // メンバ関数を格納します。 std::function<void(const Foo&, int)> f_add_display = &Foo::print_add; const Foo foo(314159); f_add_display(foo, 1); f_add_display(314159, 1); // データメンバのアクセサを格納します。 std::function<int(Foo const&)> f_num = &Foo::num_; std::cout << "num_: " << f_num(foo) << '\n'; // メンバ関数とオブジェクトを格納します。 using std::placeholders::_1; std::function<void(int)> f_add_display2 = std::bind( &Foo::print_add, foo, _1 ); f_add_display2(2); // メンバ関数とオブジェクトポインタを格納します。 std::function<void(int)> f_add_display3 = std::bind( &Foo::print_add, &foo, _1 ); f_add_display3(3); // 関数オブジェクトを格納します。 std::function<void(int)> f_display_obj = PrintNum(); f_display_obj(18); }
出力例:
-9 42 31337 314160 314160 num_: 314159 314161 314162 18
[編集] 関連項目
(C++11) |
空の std::function を呼び出したときに投げられる例外 (クラス) |
(C++11) |
メンバポインタから関数オブジェクトを作成します (関数テンプレート) |