std::function
提供: cppreference.com
<tbody>
</tbody>
| ヘッダ <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) |
メンバポインタから関数オブジェクトを作成します (関数テンプレート) |