std:: function
|
ヘッダーで定義
<functional>
|
||
|
template
<
class
>
class function ; /* undefined */ |
(C++11以降) | |
|
template
<
class
R,
class
...
Args
>
class function < R ( Args... ) > ; |
(C++11以降) | |
クラステンプレート
std::function
は汎用の多相関数ラッパーです。
std::function
のインスタンスは、あらゆる
CopyConstructible
Callable
ターゲット
を格納、コピー、呼び出しできます。これには、(それらへのポインタを介した)関数、
ラムダ式
、
bind式
、その他の関数オブジェクト、およびメンバ関数へのポインタとデータメンバへのポインタが含まれます。
格納された呼び出し可能オブジェクトは、
std::function
の
ターゲット
と呼ばれます。
std::function
がターゲットを含まない場合、それは
空
であると呼ばれます。
空
の
std::function
の
ターゲット
を呼び出すと、
std::bad_function_call
例外がスローされます。
std::function
は
CopyConstructible
および
CopyAssignable
の要件を満たします。
目次 |
メンバー型
| 型 | 定義 |
result_type
|
R
|
argument_type
(C++17で非推奨) (C++20で削除) |
T
の場合、
sizeof...
(
Args
)
==
1
かつ
T
が
Args...
内の最初かつ唯一の型である場合
|
first_argument_type
(C++17で非推奨) (C++20で削除) |
T1
の場合、
sizeof...
(
Args
)
==
2
かつ
T1
が
Args...
内の2つの型の最初の型である場合
|
second_argument_type
(C++17で非推奨) (C++20で削除) |
T2
の場合、
sizeof...
(
Args
)
==
2
かつ
T2
が
Args...
内の2つの型の2番目の型である場合
|
メンバー関数
新しい
std::function
インスタンスを構築する
(公開メンバ関数) |
|
std::function
インスタンスを破棄する
(公開メンバ関数) |
|
|
新しいターゲットを代入する
(公開メンバ関数) |
|
|
内容を交換する
(公開メンバ関数) |
|
|
(removed in C++17)
|
新しいターゲットを代入する
(公開メンバ関数) |
|
ターゲットが含まれているかチェックする
(公開メンバ関数) |
|
|
ターゲットを呼び出す
(公開メンバ関数) |
|
ターゲットアクセス |
|
|
格納されたターゲットの
typeid
を取得する
(公開メンバ関数) |
|
|
格納されたターゲットへのポインタを取得する
(公開メンバ関数) |
|
非メンバー関数
|
(C++11)
|
std::swap
アルゴリズムを特殊化
(関数テンプレート) |
|
(C++20で削除)
|
std::function
と
nullptr
を比較
(関数テンプレート) |
ヘルパークラス
|
(C++11)
(until C++17)
|
std::uses_allocator
型特性の特殊化
(クラステンプレートの特殊化) |
推論ガイド (C++17以降)
注記
|
戻り値型が参照である
|
(C++23まで) |
|
参照を返す
|
(C++23以降) |
std::function<const int&()> F([] { return 42; }); // C++23以降エラー: 返された参照を一時オブジェクトに束縛できない // 返された参照を一時オブジェクトに束縛できない int x = F(); // C++23まで未定義動作: F()の結果はダングリング参照 std::function<int&()> G([]() -> int& { static int i{0x2A}; return i; }); // OK std::function<const int&()> H([i{052}] -> const int& { return i; }); // OK
例
#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); auto factorial = [](int n) { // 「再帰的ラムダ」をエミュレートするためのラムダオブジェクトの格納。追加のオーバーヘッドに注意 std::function<int(int)> fac = [&](int n) { return (n < 2) ? 1 : n * fac(n - 1); }; // 「auto fac = [&](int n) {...};」は再帰呼び出しでは機能しないことに注意 return fac(n); }; for (int i{5}; i != 8; ++i) std::cout << i << "! = " << factorial(i) << "; "; std::cout << '\n'; }
出力例:
-9 42 31337 314160 314160 num_: 314159 314161 314162 18 5! = 120; 6! = 720; 7! = 5040;
関連項目
|
(C++23)
|
指定された呼び出しシグネチャで修飾子をサポートする任意の呼び出し可能オブジェクトのムーブ専用ラッパー
(クラステンプレート) |
|
(C++26)
|
指定された呼び出しシグネチャで修飾子をサポートする任意のコピー構築可能な呼び出し可能オブジェクトのコピー可能ラッパー
(クラステンプレート) |
|
(C++26)
|
任意の呼び出し可能オブジェクトの非所有ラッパー
(クラステンプレート) |
|
(C++11)
|
空の
std::function
を呼び出したときにスローされる例外
(クラス) |
|
(C++11)
|
メンバへのポインタから関数オブジェクトを作成する
(関数テンプレート) |
| typeid | 型の情報を問い合わせ、その型を表す std::type_info オブジェクトを返す |