C++ 11 学习之 -- std::bind总结

3650阅读 1评论2016-06-20 sytpb
分类:C/C++


1: std::bind 废掉了bind1st bind2nd not1 not2
2: mem_开头的都针对的成员函数,其中std::mem_fn 废掉了mem_fun mem_fun_ref
3: std::mem_fn 实现也只是特例,没有参数的成员函数的‘Bind’,有参数的成员函数mem_fn 无能为力了。此时需要std::bind
4: 如果函数对象需要传进的参数与上下文有关,std::bind也无能为力,此时需要lambda

用一例子说明,例子来自网友 文章总结


点击(此处)折叠或打开

  1. #include "gtest/gtest.h"
  2. #include "inc.h"
  3. #include <functional>
  4. #include <algorithm>

  5. NS_BEGIN(elloop);

  6. using namespace std;
  7. using namespace std::placeholders;

点击(此处)折叠或打开


  1. class Foo
  2. {
  3. public:
  4.     // 无参数member function
  5.     void print() { pln(a_); }

  6.     // 接受一个参数的member function
  7.     void print2(int i)
  8.     {
  9.         pln(a_);
  10.         pln(i);
  11.     }

  12.     int a_{ 100 };
  13. };
mem_fun用法

点击(此处)折叠或打开

  1. vector<Foo*> fpv;
  2. fpv.push_back(new Foo());
  3. fpv.push_back(new Foo());
  4. fpv.push_back(new Foo());
  5. fpv.push_back(new Foo());

  6. for_each(fpv.begin(), fpv.end(), mem_fun(&Foo::print));

mem_fun_ref用法

点击(此处)折叠或打开

  1. vector<Foo> fv;
  2. fv.push_back(Foo());
  3. fv.push_back(Foo());
  4. fv.push_back(Foo());
  5. fv.push_back(Foo());

  6. for_each(fv.begin(), fv.end(), mem_fun_ref(&Foo::print));
 
mem_fn既可以用于指针、引用,还可以用于对象本身,因此在C++11中使用mem_fn可以替代mem_fun和mem_fun_ref.

点击(此处)折叠或打开

  1. for_each(fpv.begin(), fpv.end(), mem_fn(&Foo::print)); // ptr in vector

  2. for_each(fv.begin(), fv.end(), mem_fn(&Foo::print)); // obj in vector


上面的都可以被bind 替代如下

点击(此处)折叠或打开

  1. for_each(fpv.begin(), fpv.end(), bind(&Foo::print, _1));  /_1占位符 不能忽略
  2. for_each(fv.begin(), fv.end(), bind(&Foo::print, _1));    // _1占位符 不能忽略

如查成员函数有参数,那只能用std::
bind

点击(此处)折叠或打开

  1. for_each(fv.begin(), fv.end(), bind(&Foo::print2, _1, 10)); _1占位符不能忽略
到此其实还没有完美,成员函数的参数只能绑定一个常数(10),如果这是一个与上下文有关的表达式呢?Bind
就无能为力了,这时就需要强大的lambda出现了

存指针的vector

点击(此处)折叠或打开

  1. void test(int n)
  2. {
  3.     for_each(fpv.begin(), fpv.end(), [&](Foo* foo)    /*注意参数形式*/
  4.     {
  5.          foo->print2(n*2);  /*上下文n互动*/
  6.     });
  7. }

存对象的的vector

点击(此处)折叠或打开

  1. void test(int n)
  2. {
  3.     for_each(fv.begin(), fv.end(), [&](Foo& foo)        /*注意参数形式*/
  4.     {
  5.          foo.print2(n*3);   /*上下文n互动*/
  6.     });
  7. }

代码来自: http://blog.csdn.net/elloop/article/details/50375820

延伸阅读:

1:Lambda函数性能优于Bind 的成员函数(函数对象),函数对象性能优于C函数,

http://blog.csdn.net/cywosp/article/details/9379403      

Effective STL 46条<<使用函数对象而不是函数作为STL算法参数>>

2:出现Bind的地方都可以被lambda 替代

3:关于unary_function 、binary_functio
n




上一篇:C++ 11 学习之 -- std::bind
下一篇:从STL关联容器的比较说起

文章评论