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有效表达式。
第一个模板函数返回具有弱的结果类型的包装 g 调用转发。 g(u1, u2, ..., uM) 的作用是result_of 类INVOKE(f, v1, v2, ..., vN, <Fty cv (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 的值是 truevi 参数为 ti(u1, u2, ..., uM),且其类型 Vi 是 result_of<Ti cv (U1&, U2&, ..., UN&>::type;
如果值 jstd::is_placeholder<Ti>::value 不为零 vi 参数为 uj,且其类型 Vi 为 Uj&;
否则 vi 参数为 ti,且其类型 Vi 是 Ti cv &。
例如命名函数 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 返回的调用包装 (RCW) 必须至少具有与较大值的所有 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);
}
要求
标头: <起作用的>
命名空间: std