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(),并且其类型 Vi 是 T&;

如果 std::is_bind_expression<Ti>::value 的值是 true 参数 vi 是 ti(u1, u2, ..., uM),并且其类型 Vi 是 result_of<Ticv(U1&, U2&, ..., UN&>::type;

如果 std::is_placeholder<Ti>::value 的值 j 不是参数 vi 是 uj,并且其类型 Vi 是 Uj&;

否则 vi 参数是 ti,并且其类型 Vi 是 Ticv&。

例如命名函数 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) 不正确。

参数的数目中的函数调用添加到 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

请参见

参考

is_bind_expression Class

_1 Object