场景需求

查找存储字符的容器中,第一个长度>=sz的元素:

  1. std::vector<string> words; // 字符容器
  2. decltype(words.size()) sz = 6; // 第一个长度>=sz的元素
  3. bool check_size(const string& a, const decltype(words.size())& sz){
  4. return a.size() >= sz;
  5. }
  6. // 调用adapter(param1)时,等价于调用check_size(param1, sz)
  7. auto adapter = std::bind(check_size, _1, sz);
  8. auto target = find_if(words.begin(), words.end(), adapter);

可以看出,std::bind是一个函数适配器,将原函数对象适配成一个不同形参列表的新函数对象。

语法

  1. // std::bind在fucntional头文件中
  2. // 函数的适配器
  3. auto newCallable = std::bind(callable, arg_list);
  4. //
  5. // 调用newCallable(args)时,等价于调用callable(arg_list)
  6. // args可能包含在arg_list中,借助占位符placeholders
  7. //
  8. // newCallable: 函数对象,callable的函数适配器
  9. // callable: 函数对象
  10. // arg_list: callable的形参列表,值传递
  11. //

例子

  1. using std::placeholders::_1; // 只使用_1
  2. using namespace std::placeholders; // 也可以直接使用全部的_n名字
  3. int &ref_a = ref(a); // 返回对象,包含a的引用,int &
  4. const int &cref_a = cref(a); // 返回a的引用,const int &
  5. // ref、cref定义在functional头文件中。
  6. // f、f1是可调用对象。
  7. auto f = bind(f1); // f() <==> f1()
  8. auto f = bind(f1, a, b); // f() <==> f1(a, b)
  9. auto f = bind(f1, ref(a), b); // f() <==> f1(a, b),ref(a)返回a的引用
  10. auto f = bind(f1, cref(c), b); // f() <==> f1(c, b),cref(c)返回c的常量引用
  11. auto f = bind(f1, _1,b); // f(_1) <==> f1(_1,b)
  12. auto f = bind(f1, b, _1); // f(_1) <==> f1(b,_1)
  13. auto f = bind(f1, _2, b, _1); // f(_1, _2) <==> f1(_2, b, _1)
  14. auto f = bind(f1, _3, b, _1); // f(_1, v2,_3) <==> f1(_3, b, _1)