В чем разница между std:: function и std::mem fn
у меня возникли проблемы с выяснением разницы между двумя функциональными оболочками std::function
и std::mem_fn
. Из описания мне кажется, что std:: function делает все std::mem_fn
делает и многое другое. В каком случае можно было бы использовать std::mem_fn
над std::function
?
2 ответов
вы не можете сравнить 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};
как бы вы сделали функтор, который просто вызывает getX()
в данной A
?
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
более лаконичные в этом случае. Однако, если мы хотим связать конкретный аргумент, скажем call add(5)
в данной A
, вы можете сделать это только с bind
:
auto add_5 = std::bind(&A::add, _1, 5);
add_5(a); // yields 7
в конечном счете, никакого сравнения между function
и mem_fn
, но временами предпочитают mem_fn
to bind
.
обертка возвращается std::mem_fn
очень легкий, это тонкая обертка вокруг указателя на член.
std::function
использует стирание типа, что намного тяжелее.