【问题标题】:What is the difference between std::function and std::mem_fnstd::function 和 std::mem_fn 有什么区别
【发布时间】:2015-07-18 08:24:29
【问题描述】:

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

【问题讨论】:

  • 您的意思是std::function 还是std::mem_fn 的返回类型?比较类模板和函数模板对我来说没有多大意义。

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


【解决方案1】:

您无法真正将 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 在这种情况下更简洁。然而,如果我们想绑定一个特定的参数,比如在给定的A 上调用add(5),你只能用bind 来做到这一点:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-01-16
      • 2014-07-22
      • 2023-04-09
      • 2020-10-16
      • 2020-09-30
      • 2021-10-16
      • 2019-02-26
      • 2013-02-07
      相关资源
      最近更新 更多