函数模板
<functional>

std::bind

简单 (1)
template <class Fn, class... Args>  /* unspecified */ bind (Fn&& fn, Args&&... args);
带返回类型 (2)
template <class Ret, class Fn, class... Args>  /* unspecified */ bind (Fn&& fn, Args&&... args);
绑定函数参数
返回一个基于 fn 的函数对象,但其参数已绑定到 args

每个参数可以绑定到一个,也可以是占位符
- 如果绑定到,调用返回的函数对象时将始终使用该值作为参数。
- 如果是占位符,调用返回的函数对象时会将调用时传递的参数转发过去(其顺序由占位符指定)。

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

返回对象的类型具有以下属性
  • 其函数调用返回的类型与 fn 相同,并将参数绑定到 args...(或对于占位符进行转发)。
  • 对于(1),它可能有一个成员 result_type:如果 Fn 是指向函数或成员函数的指针类型,则定义为其返回类型的别名。否则,如果存在这样的成员类型,则定义为 Fn::result_type
  • 对于(2),它有一个成员 result_type,定义为 Ret 的别名。
  • 它是可移动构造的,如果其所有参数的类型都是可拷贝构造的,那么它也是可拷贝构造的。这两个构造函数都不会抛出异常,前提是 FnArgs...decay types 的相应构造函数都不抛出异常。

参数

fn
一个函数对象、指向函数的指针或指向成员的指针。
Fndecay type 必须是可以从 fn 移动构造的。
args...
要绑定的参数列表:可以是值,也可以是占位符
Args... 中的类型,其decay types 必须可以从 args... 中的相应参数移动构造
如果任何参数的decay typereference_wrapper,则它会绑定到其引用的值。

返回值

一个函数对象,当调用它时,会调用 fn 并将其参数绑定到 args

如果 fn 是指向成员的指针,则返回的函数期望的第一个参数是 fn 指向成员的类对象(或其引用、或其指针)。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
// 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


数据竞争

可以通过调用来访问和/或修改参数。

异常安全

基本保证:如果抛出异常,所有涉及的对象都将保持有效状态。
此函数仅在构造其任何内部元素(FnArgs...decay types)时可能抛出异常。

另见