我无法弄清楚两个函数包装器std::function
和std::mem_fn
之间的区别。从描述中可以看出,std :: function可以完成<ui:composition template="/WEB-INF/templates/masterLayout.xhtml">
所做的一切。在哪个实例中,std::mem_fn
会使用std::mem_fn
?
答案 0 :(得分:19)
您无法将std::function
与std::mem_fn
进行比较。前者是您指定类型的类模板,后者是具有未指定返回类型的函数模板。在某种情况下,您实际上并不认为一个与另一个相对。
更好的比较可能在mem_fn
和std::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
最终,function
和mem_fn
之间没有比较,但有时候更喜欢mem_fn
到bind
。
答案 1 :(得分:9)
std::mem_fn
返回的包装器非常轻量级;它是指向成员的指针的薄包装。
std::function
使用类型擦除,这是更重量级的。