std :: function和std :: mem_fn有什么区别

时间:2015-05-07 16:17:18

标签: c++ c++11 stl function-pointers std-function

我无法弄清楚两个函数包装器std::functionstd::mem_fn之间的区别。从描述中可以看出,std :: function可以完成<ui:composition template="/WEB-INF/templates/masterLayout.xhtml"> 所做的一切。在哪个实例中,std::mem_fn会使用std::mem_fn

2 个答案:

答案 0 :(得分:19)

您无法将std::functionstd::mem_fn进行比较。前者是您指定类型的类模板,后者是具有未指定返回类型的函数模板。在某种情况下,您实际上并不认为一个与另一个相对。

更好的比较可能在mem_fnstd::bind之间。在那里,对于指向成员的指针的特定用例,mem_fn如果想要做的就是传递所有参数,那么将会更加冗长。鉴于这种简单的类型:

struct A { 
    int x;
    int getX() { return x; }
    int add(int y) { return x+y; }
};

A a{2};

如何制作仅在给定getX()上调用A的仿函数?

auto get1 = std::mem_fn(&A::getX);
auto get2 = std::bind(&A::getX, _1);

get1(a); // yields 2
get2(a); // same

并为add

添加了一个额外的参数
auto add1 = std::mem_fn(&A::add);
auto add2 = std::bind(&A::add, _1, _2);

add1(a, 5); // yields 7
add2(a, 5); // same

因此mem_fn在这种情况下更简洁 。但是,如果我们想要绑定特定参数,请在给定add(5)上调用A,则只能使用bind执行此操作:

auto add_5 = std::bind(&A::add, _1, 5);
add_5(a); // yields 7 

最终,functionmem_fn之间没有比较,但有时候更喜欢mem_fnbind

答案 1 :(得分:9)

std::mem_fn返回的包装器非常轻量级;它是指向成员的指针的薄包装。

std::function使用类型擦除,这是更重量级的。