名前空間
変種
操作

std::function

提供: cppreference.com
< cpp‎ | utility‎ | functional
 
 
 
関数オブジェクト
関数ラッパー
function
(C++11)
(C++11)
関数の部分適用
(C++20)
(C++11)
関数呼び出し
(C++17)
恒等関数オブジェクト
(C++20)
参照ラッパー
(C++11)(C++11)
演算子ラッパー
否定子
(C++17)
検索子
制約付き比較子
古いバインダとアダプタ
(C++17未満)
(C++17未満)
(C++17未満)
(C++17未満)
(C++17未満)(C++17未満)(C++17未満)(C++17未満)
(C++20未満)
(C++20未満)
(C++17未満)(C++17未満)
(C++17未満)(C++17未満)

(C++17未満)
(C++17未満)(C++17未満)(C++17未満)(C++17未満)
(C++20未満)
(C++20未満)
 
 
ヘッダ <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::functionCopyConstructible および CopyAssignable の要件を満たします。

目次

[編集] メンバ型

定義
result_type R
argument_type(C++17で非推奨)(C++20で削除) sizeof...(Args)==1 であり、 TArgs... の最初かつ唯一の型の場合、 T
first_argument_type(C++17で非推奨)(C++20で削除) sizeof...(Args)==2 であり、 T1Args... の2つの型の1つめの場合、 T1
second_argument_type(C++17で非推奨)(C++20で削除) sizeof...(Args)==2 であり、 T2Args... の2つの型の2つめの場合、 T2

[編集] メンバ関数

新しい std::function のインスタンスを構築します
(パブリックメンバ関数) [edit]
std::function のインスタンスを破棄します
(パブリックメンバ関数) [edit]
新しいターゲットを代入します
(パブリックメンバ関数) [edit]
内容を入れ替えます
(パブリックメンバ関数) [edit]
(C++17未満)
新しいターゲットを代入します
(パブリックメンバ関数) [edit]
有効なターゲットが格納されているかどうか調べます
(パブリックメンバ関数) [edit]
ターゲットを呼び出します
(パブリックメンバ関数) [edit]
ターゲットのアクセス
格納されているターゲットの typeid を取得します
(パブリックメンバ関数) [edit]
格納されているターゲットを指すポインタを返します
(パブリックメンバ関数) [edit]

[編集] 非メンバ関数

std::swap アルゴリズムの特殊化
(関数テンプレート) [edit]
std::functionnullptr と比較します
(関数テンプレート) [edit]

[編集] ヘルパークラス

std::uses_allocator 型特性の特殊化
(クラステンプレートの特殊化) [edit]

[編集] 推定ガイド(C++17以上)

[編集]

#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

[編集] 関連項目

空の std::function を呼び出したときに投げられる例外
(クラス) [edit]
(C++11)
メンバポインタから関数オブジェクトを作成します
(関数テンプレート) [edit]