В чем разница между 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 использует стирание типа, что намного тяжелее.