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

Vic*_*ers 8 c++ stl function-pointers c++11 std-function

我有麻烦搞清楚这两个函数包装之间的差异std::functionstd::mem_fn.从描述中,在我看来,std :: function确实std::mem_fn做到了.在这种情况下将一个使用std::mem_fnstd::function

Bar*_*rry 20

你不能真正比较std::functionstd::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};
Run Code Online (Sandbox Code Playgroud)

你如何制作一个只调用getX()给定的仿函数A

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

get1(a); // yields 2
get2(a); // same
Run Code Online (Sandbox Code Playgroud)

并采取额外的论据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
Run Code Online (Sandbox Code Playgroud)

因此在这种情况下mem_fn更简洁.但是,如果我们想要绑定一个特定的参数,比如对一个给定的调用,你只能这样做:add(5)Abind

auto add_5 = std::bind(&A::add, _1, 5);
add_5(a); // yields 7 
Run Code Online (Sandbox Code Playgroud)

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


T.C*_*.C. 9

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

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