gpt4 book ai didi

c++ - std::function 和 std::mem_fn 有什么区别

转载 作者:可可西里 更新时间:2023-11-01 16:57:51 26 4
gpt4 key购买 nike

我无法弄清楚两个函数包装器之间的区别 std::functionstd::mem_fn .从描述来看,在我看来,std::function 可以完成 std::mem_fn 所做的一切,甚至更多。在哪种情况下会使用 std::mem_fn 而不是 std::function

最佳答案

您不能真正将 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};

如何制作一个仅在给定 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 在这种情况下 更简洁。但是,如果我们想绑定(bind)一个特定的参数,比如在给定的 A 上调用 add(5),您只能使用 bind :

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

最终,functionmem_fn 之间没有比较,但有时更喜欢 mem_fn 而不是 bind

关于c++ - std::function 和 std::mem_fn 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30106561/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com