您无法真正将 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};
您将如何创建一个仅在给定 A 上调用 getX() 的函子?
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 在这种情况下更简洁。然而,如果我们想绑定一个特定的参数,比如在给定的A 上调用add(5),你只能用bind 来做到这一点:
auto add_5 = std::bind(&A::add, _1, 5);
add_5(a); // yields 7
最终,function 和 mem_fn 之间没有可比性,但有时会更喜欢 mem_fn 而不是 bind。