Home C&C++函数库 c++ 语法 程序源码 Linux C库

std::

bind

类模板  <functional>

simple(1)
template <class Fn, class... Args>
  /* unspecified */ bind (Fn&& fn, Args&&... args);
with return type (2)
template <class Ret, class Fn, class... Args>
  /* unspecified */ bind (Fn&& fn, Args&&... args);

绑定函数参数
返回一个基于fn的函数对象,等价于以一些绑定到args的参数调用fn 。

每个参数可以绑定到一个值,也可以是一个占位符(placeholders):
- 如果绑定到一个值,调用返回的函数对象将始终使用该值作为参数。
- 如果是占位符,调用返回的函数对象将传递给调用的参数(即由占位符指定序号的参数)。

调用返回对象将返回与fn相同的类型,除非指定了Ret(2)特定的返回类型 (注意Ret是唯一不能通过传递给该函数的参数隐式推导出来的模板形参)。

返回对象的类型有以下属性:


☲  参数


fn
一个可调用对象(可以是函数对象、函数指针、函数引用、成员函数指针、数据成员指针),它的参数将绑定到args.
Fn应具有可由Fn移动构造(move-constructible)的衰变类型(decay types)。

args...
要绑定的参数列表:值或占位符(placeholders)。
Args…中的类型应该具有从args....中各自的参数中可移动构造(move-constructible)的衰变类型(decay types)。
如果对于任何参数,其衰变类型(decay types)为reference_wrapper,则它将绑定到其引用的值。

☉  返回值



一个未指定类型T的函数对象,T满足以下条件:std::is_bind_expression<T>::value == true.

如果fn是指向类的成员函数,则返回函数第一个参数应该是该类的成员、或者成员对象的引用、或者是成员对象的指针。

☣  示例



// bind example
#include <iostream>     // std::cout
#include <functional>   // std::bind

// a function: (also works with function object: std::divides<double> my_divide;)
double my_divide (double x, double y) {return x/y;}

struct MyPair {
  double a,b;
  double multiply() {return a*b;}
};

int main () {
  using namespace std::placeholders;    // adds visibility of _1, _2, _3,...

  // binding functions:
  auto fn_five = std::bind (my_divide,10,2);               // returns 10/2
  std::cout << fn_five() << '\n';                          // 5

  auto fn_half = std::bind (my_divide,_1,2);               // returns x/2
  std::cout << fn_half(10) << '\n';                        // 5

  auto fn_invert = std::bind (my_divide,_2,_1);            // returns y/x
  std::cout << fn_invert(10,2) << '\n';                    // 0.2

  auto fn_rounding = std::bind<int> (my_divide,_1,_2);     // returns int(x/y)
  std::cout << fn_rounding(10,3) << '\n';                  // 3

  MyPair ten_two {10,2};

  // binding members:
  auto bound_member_fn = std::bind (&MyPair::multiply,_1); // returns x.multiply()
  std::cout << bound_member_fn(ten_two) << '\n';           // 20

  auto bound_member_data = std::bind (&MyPair::a,ten_two); // returns ten_two.a
  std::cout << bound_member_data() << '\n';                // 10

  return 0;
}

输出:
5
5
0.2
3
20
10

⇄ 数据竞争



参数可以被调用访问和/或修改。

☂ 异常安全性



基本保证:如果抛出异常,所有涉及的对象都保持有效状态。 只有当该函数的任何内部元素(Fn和Args… 的decay types)的构造被抛出时,该函数才会抛出。

🍄  另请参阅



placeholders 绑定参数占位符(命名空间)

联系我们 免责声明 关于CandCplus 网站地图