名前空間
変種
操作

std::bind

提供: cppreference.com
< cpp‎ | utility‎ | functional
 
 
 
関数オブジェクト
関数ラッパー
Original:
Function wrappers
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
function(C++11)
mem_fn(C++11)
bad_function_call(C++11)
バインド
Original:
Bind
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
bind(C++11)
is_bind_expression(C++11)
is_placeholder(C++11)
_1, _2, _3, ...(C++11)
リファレンス·ラッパー
Original:
Reference wrappers
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
reference_wrapper(C++11)
ref
cref
(C++11)
(C++11)
オペレーターのラッパー
Original:
Operator wrappers
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
否定子
Original:
Negators
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
バインダーおよびアダプタは非推奨になりました
Original:
Deprecated binders and adaptors
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
unary_function(廃止予定)
binary_function(廃止予定)
ptr_fun(廃止予定)
pointer_to_unary_function(廃止予定)
pointer_to_binary_function(廃止予定)
mem_fun(廃止予定)
mem_fun_t
mem_fun1_t
const_mem_fun_t
const_mem_fun1_t
(廃止予定)
(廃止予定)
(廃止予定)
(廃止予定)
mem_fun_ref(廃止予定)
mem_fun_ref_t
mem_fun1_ref_t
const_mem_fun_ref_t
const_mem_fun1_ref_t
(廃止予定)
(廃止予定)
(廃止予定)
(廃止予定)
binder1st
binder2nd
(廃止予定)
(廃止予定)
bind1st
bind2nd
(廃止予定)
(廃止予定)
 
Defined in header <functional>
template< class F, class... Args >
/*unspecified*/ bind( F&& f, Args&&... args );
(1) (C++11およびそれ以降)
template< class R, class F, class... Args >
/*unspecified*/ bind( F&& f, Args&&... args );
(2) (C++11およびそれ以降)

テンプレート関数bindfへの転送呼び出しラッパーを生成します。このラッパーを呼び出しは引数の一部をargsにより部分適用したfへの呼び出しと同等になります。

内部的には、ラッパーは、std::forward<F>(f)により構築されたstd::decay<F>::type型のオブジェクトと、args...のそれぞれに対してstd::forward<Arg_i>(arg_i)により構築されたstd::decay<Arg_i>::type型のオブジェクトを一つ一つをメンバとして持つ。

目次

[編集] パラメータ

f - 引数を部分適用する呼び出し可能オブジェクト(関数オブジェクト、関数へのポインタ、関数への参照、メンバ関数へのポインタ、またはデータメンバへのポインタ)
args - 部分適用される引数のリスト。部分適用しない引数にはプレースホルダ_1, _2, _3...を使用する.


[編集] 返り値

std::functionに格納することができる、std::is_bind_expression<T>::value == trueとなるような型Tの関数オブジェクト。fargsが全てムーブ可能ならば返り値はムーブ可能となり、それ以外の場合はコピー可能となります.型は、以下のメンバーを定義します.

{{member | std::bind の返り値の型 | 2=

[編集] 型メンバ result_type

1) Fが関数またはメンバ関数へのポインタならば、result_typeFの返り値の型となります. Fがネストされたtypedef名result_typeを持つならば、 result_typeF::result_typeとなります. それ以外の場合はresult_typeは定義されません.

2) result_typeRと一致します.

[編集] メンバ関数 operator()

オブジェクトg}を<code>bindへの呼び出しにより得たものとして、式g(u1, u2, ... uM)による呼び出しは、保存されたstd::decay<F>::type型のオブジェクトへの次のように定義される引数を指定した呼び出しと同等です。

  • bindへの引数の型がstd::reference_wrapper<T>だった場合、 (例: std::ref または std::cref) 参照T&が部分適用された引数として格納され、呼出可能オブジェクトに渡されます.
  • std::is_bind_expression<T>::value == trueの場合、 (つまりbindbindの引数として指定された場合)、引数として指定されたbind式がただちに呼び出され、返り値が呼び出し可能オブジェクトに渡されます. 引数として指定されたbind式がプレースホルダを含んでいた場合、それらに対応する実引数はu1, u2, ...から採られます.
  • std::is_placeholder<T>::value != 0の場合(つまり _1, _2, _3, ...bindの引数として指定された場合)、プレースホルダに対応する引数(_1には(u1_2にはu2等)がstd::forward<Uj>(uj)として呼び出し可能オブジェクトに渡されます.
  • それ以外の場合、格納された引数がそのまま呼び出し可能オブジェクトに渡されます。

g()の呼び出し時に指定する引数が、 gに格納されたプレースホルダに対応しない場合、評価された上で無視されます。

</code>

[編集] 例外

std::forward<F>(f)からstd::decay<F>::typeのコンストラクトが、もしくはstd::forward<Arg_i>(arg_i)からstd::decay<Arg_i>::typeのコンストラクトが例外を投げる場合のみ例外を投げます.ここでArg_iはi番目の型、arg_iはi番目の引数を示します。

[編集]

bindの引数は、コピーまたはムーブされ、std::refまたはstd::crefでラップされていない限り、参照渡しされることはありません.

同じbind式内で重複したプレースホルダを書くこと(複数の_1など)は許容されますが、対応する引数(u1)が左辺値またはムーブ不可の右辺値である場合以外の結果は未定義です。

[編集]

#include <random>
#include <iostream>
#include <functional>
 
void f(int n1, int n2, int n3, const int& n4, int n5)
{
    std::cout << n1 << ' ' << n2 << ' ' << n3 << ' ' << n4 << ' ' << n5 << '\n';
}
 
int g(int n1)
{
    return n1;
}
 
struct Foo {
    void print_sum(int n1, int n2)
    {
        std::cout << n1+n2 << '\n';
    }
    int data = 10;
};
 
int main()
{
    using namespace std::placeholders;
 
    // demonstrates argument reordering and pass-by-reference
    int n = 7;
    auto f1 = std::bind(f, _2, _1, 42, std::cref(n), n);
    n = 10;
    f1(1, 2, 1001); // 1 is bound by _1, 2 is bound by _2, 1001 is unused
 
    // nested bind subexpressions share the placeholders
    auto f2 = std::bind(f, _3, std::bind(g, _3), _3, 4, 5);
    f2(10, 11, 12);
 
    // common use case: binding a RNG with a distribution
    std::default_random_engine e;
    std::uniform_int_distribution<> d(0, 10);
    std::function<int()> rnd = std::bind(d, e);
    for(int n=0; n<10; ++n)
        std::cout << rnd() << ' ';
    std::cout << '\n';
 
    // bind to a member function
    Foo foo;
    auto f3 = std::bind(&Foo::print_sum, foo, 95, _1);
    f3(5);
 
    // bind to member data
    auto f4 = std::bind(&Foo::data, _1);
    std::cout << f4(foo) << '\n';
}

出力:

2 1 42 10 7
12 12 12 4 5
1 5 0 2 0 8 2 2 10 8
100
10

[編集] 参考

std::bind式での非バインド引数のプレースホルダ
Original:
placeholders for the unbound arguments in a std::bind expression
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.

(定数) [edit]
(C++11)
メンバへのポインタの関数オブジェクトを作成します
Original:
creates a function object out of a pointer to a member
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.

(関数テンプレート) [edit]