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
用一例子说明,例子来自网友
文章总结
-
#include "gtest/gtest.h"
-
#include "inc.h"
-
#include <functional>
-
#include <algorithm>
-
-
NS_BEGIN(elloop);
-
-
using namespace std;
-
using namespace std::placeholders;
-
-
class Foo
-
{
-
public:
-
// 无参数member function
-
void print() { pln(a_); }
-
-
// 接受一个参数的member function
-
void print2(int i)
-
{
-
pln(a_);
-
pln(i);
-
}
-
-
int a_{ 100 };
-
};
mem_fun用法
-
vector<Foo*> fpv;
-
fpv.push_back(new Foo());
-
fpv.push_back(new Foo());
-
fpv.push_back(new Foo());
-
fpv.push_back(new Foo());
-
-
for_each(fpv.begin(), fpv.end(), mem_fun(&Foo::print));
mem_fun_ref用法
-
vector<Foo> fv;
-
fv.push_back(Foo());
-
fv.push_back(Foo());
-
fv.push_back(Foo());
-
fv.push_back(Foo());
-
-
for_each(fv.begin(), fv.end(), mem_fun_ref(&Foo::print));
mem_fn既可以用于指针、引用,还可以用于对象本身,因此在C++11中使用mem_fn可以替代mem_fun和mem_fun_ref.
-
for_each(fpv.begin(), fpv.end(), mem_fn(&Foo::print)); // ptr in vector
-
-
for_each(fv.begin(), fv.end(), mem_fn(&Foo::print)); // obj in vector
上面的都可以被bind 替代如下
-
for_each(fpv.begin(), fpv.end(), bind(&Foo::print, _1)); // _1占位符 不能忽略
-
for_each(fv.begin(), fv.end(), bind(&Foo::print, _1)); // _1占位符 不能忽略
如查成员函数有参数,那只能用std::bind
-
for_each(fv.begin(), fv.end(), bind(&Foo::print2, _1, 10)); _1占位符不能忽略
到此其实还没有完美,成员函数的参数只能绑定一个常数(10),如果这是一个与
上下文有关的表达式呢?Bind
就无能为力了,
这时就需要强大的lambda出现了。
存指针的vector
-
void test(int n)
-
{
-
for_each(fpv.begin(), fpv.end(), [&](Foo* foo) /*注意参数形式*/
-
{
-
foo->print2(n*2); /*上下文n互动*/
-
});
-
}
存对象的的vector
-
void test(int n)
-
{
-
for_each(fv.begin(), fv.end(), [&](Foo& foo) /*注意参数形式*/
-
{
-
foo.print2(n*3); /*上下文n互动*/
-
});
-
}
代码来自: 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_function
阅读(3521) | 评论(1) | 转发(0) |