C++ std::bind

simple(1)

template <class Fn, class... Args> /* 

unspecified */ bind (Fn&& fn, Args&&... args);

simple(2)(带返回类型)

template <class Ret, class Fn, class... Args> /*

unspecified */ bind (Fn&& fn, Args&&... args);

定义:

返回一个基于Fn的function对象,Fn的所有参数绑定到args

Fn需要的参数可以绑定到一个值或者占位符(std::placeholders)

  1. 如果绑定到一个值,调用返回的方法对象时,将要使用绑定的值作为参数
  2. 如果绑定到一个占位符,调用返回的函数对象时使用的参数,将会传递给被调用的函数作为参数(参数的对应索引由占位符的决定)。

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

返回的对象有下面的属性:

  1. 返回的函数对象的参数绑定到args…(或作为占位符转发)。
  2. 对于simple(1),它可能有一个成员result_type:如果Fn是一个指向函数或成员函数类型的指针,它被定义为其返回类型的别名。否则,如果存在这样的成员类型,则将其定义为Fn::result_type。
  3. 对于simple(2),它有一个成员result_type,决定调用函数对象时的返回值类型。
  4. 它是可移动可构造的,如果它的所有参数的类型都是可复制可构造的,那么它也是可复制可构造的。如果Fn和Args的衰变类型没有相应的构造函数,那么这两个构造函数都不会抛出。

参数:

fn:一个指向函数或者成员的指针。

args...:将要绑定的参数列表,类型为值或者占位符。

返回类型:

返回一个函数对象,调用的时候,将会使用绑定的参数调用fn。

如果fn是一个指向类成员的指针,返回的函数对象被调用时,第一个参数必须是函数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

Data Races:

参数能在被调用时获取或修改 

Exception safety:

如果一个异常被抛出,所有涉及到的对象都被设为有效的状态。
这个函数只有在其内部元素(Fn和Args的衰变类型…)的构造抛出时才会抛出。

发布了17 篇原创文章 · 获赞 9 · 访问量 8659

猜你喜欢

转载自blog.csdn.net/qq_39025293/article/details/104434908
今日推荐