名前空間
変種
操作

std::function

提供: cppreference.com
< cpp‎ | utility‎ | functional
 
 
 
関数オブジェクト
関数ラッパー
function
(C++11)
(C++11)
バインド
(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 なターゲット -- 関数、ラムダ式バインド式、その他の関数オブジェクト、さらにメンバ関数を指すポインタやデータメンバを指すポインタも格納することができ、コピーしたり、呼び出したりできます。

格納された 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()
{
    // store a free function
    std::function<void(int)> f_display = print_num;
    f_display(-9);
 
    // store a lambda
    std::function<void()> f_display_42 = []() { print_num(42); };
    f_display_42();
 
    // store the result of a call to std::bind
    std::function<void()> f_display_31337 = std::bind(print_num, 31337);
    f_display_31337();
 
    // store a call to a member function
    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);
 
    // store a call to a data member accessor
    std::function<int(Foo const&)> f_num = &Foo::num_;
    std::cout << "num_: " << f_num(foo) << '\n';
 
    // store a call to a member function and object
    using std::placeholders::_1;
    std::function<void(int)> f_add_display2 = std::bind( &Foo::print_add, foo, _1 );
    f_add_display2(2);
 
    // store a call to a member function and object ptr
    std::function<void(int)> f_add_display3 = std::bind( &Foo::print_add, &foo, _1 );
    f_add_display3(3);
 
    // store a call to a function object
    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]