bind 関数
呼び出し可能オブジェクトに引数をバインドします。
template<class Fty, class T1, class T2, ..., class TN>
unspecified bind(Fty fn, T1 t1, T2 t2, ..., TN tN);
template<class Ret, class Fty, class T1, class T2, ..., class TN>
unspecified bind(Fty fn, T1 t1, T2 t2, ..., TN tN);
パラメーター
Fty
呼び出すオブジェクトの型。TN
N 番目の呼び出し引数の型。fn
呼び出すオブジェクト。tN
N 番目の呼び出し引数。
解説
型 Fty, T1, T2, ..., TN は、コピーによる構築が可能である必要があります。また、INVOKE(fn, t1, ..., tN) は、特定の値 w1, w2, ..., wN に対して有効な式である必要があります。
1 つ目のテンプレート関数は、弱い結果型を持つ転送呼び出しラッパー g を返します。最終的には、g(u1, u2, ..., uM) が INVOKE(f, v1, v2, ..., vN, result_of クラス<Fty cv (V1, V2, ..., VN)>::type) に展開されます。cv は g の cv 修飾子を表し、バインド引数 v1, v2, ..., vN の値と型は、この後に説明する規則に従って決定されます。これを使って、引数を呼び出し可能オブジェクトにバインドすることにより、引数リストを自由にカスタマイズしながら呼び出し可能オブジェクトを作成できます。
2 つ目のテンプレート関数は、入れ子にされた型 result_type (Ret のシノニム) を持つ転送呼び出しラッパー g を返します。最終的には、g(u1, u2, ..., uM) が INVOKE(f, v1, v2, ..., vN, Ret) に展開されます。cv は g の cv 修飾子を表し、バインド引数 v1, v2, ..., vN の値と型は、この後に説明する規則に従って決定されます。これを使って、引数を呼び出し可能オブジェクトにバインドすることにより、引数リストと戻り値の型を自由にカスタマイズしながら呼び出し可能オブジェクトを作成できます。
バインド引数 (v1, v2, ..., vN) の値および対応する型 (V1, V2, ..., VN) は、bind の呼び出しにおける型 Ti の対応する引数 ti の型と、呼び出しラッパー g の cv 修飾子 cv に依存します。具体的には、次の規則に従って決定されます。
ti が reference_wrapper<T> 型である場合、引数 vi は ti.get() で、その型 Vi は T& になります。
std::is_bind_expression<Ti>::value の値が true である場合、引数 vi は ti(u1, u2, ..., uM) で、その型 Vi は result_of<Ti cv (U1&, U2&, ..., UN&>::type になります。
std::is_placeholder<Ti>::value の値 j がゼロ以外である場合、引数 vi は uj で、その型 Vi は Uj& になります。
それ以外の場合、引数 vi は ti で、その型 Vi は Ti cv & になります。
たとえば、f(int, int) という関数があるとき、式 bind(f, _1, 0) は、cw(x) で f(x, 0) が呼び出されるような転送呼び出しラッパー cw を返します。式 bind(f, 0, _1) は、cw(x) で f(0, x) が呼び出されるような転送呼び出しラッパー cw を返します。
引数 fn に加え、bind の呼び出しに対する引数の数は、呼び出し可能オブジェクト fn に渡すことのできる引数の数と等しくする必要があります。したがって、bind(cos, 1.0) とすることはできますが、bind(cos) や bind(cos, _1, 0.0) とすることはできません。
bind から返される呼び出しラッパーに対しての関数呼び出しの引数の数は、bind の呼び出しに含まれる、すべてのプレースホルダー引数についての is_placeholder<PH>::value の最大値と同じか、それ以上である必要があります。したがって、bind(cos, _2)(0.0, 1.0) とすることはできますが (つまり、cos(1.0) が返される)、bind(cos, _2)(0.0) とすることはできません。
使用例
// std_tr1__functional__bind.cpp
// compile with: /EHsc
#include <functional>
#include <algorithm>
#include <iostream>
using namespace std::placeholders;
void square(double x)
{
std::cout << x << "^2 == " << x * x << std::endl;
}
void product(double x, double y)
{
std::cout << x << "*" << y << " == " << x * y << std::endl;
}
int main()
{
double arg[] = {1, 2, 3};
std::for_each(&arg[0], arg + 3, square);
std::cout << std::endl;
std::for_each(&arg[0], arg + 3, std::bind(product, _1, 2));
std::cout << std::endl;
std::for_each(&arg[0], arg + 3, std::bind(square, _1));
return (0);
}
必要条件
ヘッダー : <functional>
名前空間: std