bind Function
繫結引數設為可呼叫的物件。
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有效的運算式。
第一個樣板函式傳回具有弱式之結果型別的轉送呼叫包裝函式 g 。 g(u1, u2, ..., uM) 效果是 INVOKE(f, v1, v2, ..., vN,result_of Class<Ftycv(V1, V2, ..., VN)>::type),其中 cv 是 g cv 限定詞,必須的引數 v1, v2, ..., vN 的值和型別來決定如下所述。 您會用它來繫結引數至可呼叫之物件對已修改的引數清單的可呼叫的物件。
第二個樣板函式傳回與 Ret之同義資料表的巢狀型別 result_type 的順向呼叫包裝函式 g 。 g(u1, u2, ..., uM) 效果是 INVOKE(f, v1, v2, ..., vN, Ret), cv 是 g cv 限定詞,必須的引數 v1, v2, ..., vN 的值和型別來決定如下所述。 您會用它來繫結引數至可呼叫的物件來建立可呼叫的物件使用已修改的引數清單並使用指定的傳回型別。
繫結的引數 v1, v2, ..., vN 及其對應的型別 V1, V2, ..., VN 的值取決於型別 Ti 至 bind 和呼叫包裝函式 g 的 cv 限定詞 cv 的對應引數 ti 類型在呼叫中如下所示:
如果 ti 是型別 reference_wrapper<T> 引數 vi 是 ti.get() ,而其型別是 ViT&;
如果 std::is_bind_expression<Ti>::value 的值是 true 引數 vi 是 ti(u1, u2, ..., uM) ,而其型別是 Viresult_of<Ticv(U1&, U2&, ..., UN&>::type;
如果 std::is_placeholder<Ti>::value 的值 j 不為零引數 vi 是 uj ,而其型別是 ViUj&;
否則這個引數 vi 是 ti ,而其型別是 ViTicv&。
以函式 f(int, int) 運算式 bind(f, _1, 0) 傳回順向呼叫包裝函式 cw 這類 cw(x) 呼叫 f(x, 0)。 運算式會傳回 bind(f, 0, _1) 順向呼叫包裝函式 cw 這類 cw(x) 呼叫 f(0, x)。
引數的數目會在的呼叫中刪除這個引數 fn 以外的 bind 必須等於可以傳遞至可呼叫的物件 fn引數數目。 因此, bind(cos, 1.0) 是正確的,因此, bind(cos) 和 bind(cos, _1, 0.0) 不正確。
引數數目函式呼叫 (Function Call) 的 [ bind 傳回的呼叫包裝函式都必須至少具有可以與 is_placeholder<PH>::value 的最大數字值的所有在呼叫的預留位置引數傳遞至 bind。 因此, 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