std::function 和 std::mem_fn 有什么区别
What is the difference between std::function and std::mem_fn
我无法弄清楚两个函数包装器之间的区别 std::function
and std::mem_fn
。从描述来看,在我看来 std::function 可以完成 std::mem_fn
所做的一切,甚至更多。在哪种情况下会使用 std::mem_fn
而不是 std::function
?
std::mem_fn
返回的包装器非常轻量级;它是指向成员的指针的薄包装。
std::function
使用类型擦除,重量级很多
您无法真正将 std::function
与 std::mem_fn
进行比较。前者是你指定类型的class模板,后者是未指定return类型的函数模板。在任何情况下,您实际上都不会真正考虑一个与另一个。
更好的比较可能是 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
。
我无法弄清楚两个函数包装器之间的区别 std::function
and std::mem_fn
。从描述来看,在我看来 std::function 可以完成 std::mem_fn
所做的一切,甚至更多。在哪种情况下会使用 std::mem_fn
而不是 std::function
?
std::mem_fn
返回的包装器非常轻量级;它是指向成员的指针的薄包装。
std::function
使用类型擦除,重量级很多
您无法真正将 std::function
与 std::mem_fn
进行比较。前者是你指定类型的class模板,后者是未指定return类型的函数模板。在任何情况下,您实际上都不会真正考虑一个与另一个。
更好的比较可能是 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
。