Chinaunix首页 | 论坛 | 博客
  • 博客访问: 290907
  • 博文数量: 63
  • 博客积分: 814
  • 博客等级: 军士长
  • 技术积分: 700
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-09 15:46
文章分类

全部博文(63)

文章存档

2017年(1)

2016年(4)

2015年(13)

2014年(9)

2012年(3)

2011年(33)

分类: C/C++

2016-06-20 08:23:37


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




阅读(3423) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

sytpb2016-06-20 09:39:46

欢迎批评