std::mem_fun vs std::mem_fn
В чем разница между std::mem_fun
а также std::mem_fn
? Почему наименование так запутанно?
В документации Boost говорится, что std::mem_fn
может заменить std::mem_fun
в большинстве случаев. Так в какой ситуации вы бы все еще использовали std::mem_fun
?
1 ответ
std::mem_fun
устарела. std::mem_fn
может делать все, что делает, и делает это более удобно. Отношение между ними такое же, как отношение между std::bind1st
/std::bind2nd
и C++11 std::bind
, И то и другое std::mem_fn
а также std::bind
были разработаны и освоены после std::bind1st
а также std::mem_fun
были включены в стандарт C++98. Таким образом, это означает, что нам пришлось подождать, пока C++11 должным образом не заменит старые вещи превосходными альтернативами.
Например, std::mem_fun
может иметь дело только с функциями-членами, которые принимают один аргумент или не имеют его. std::mem_fn
является переменным и может иметь дело с членами, которые принимают любое количество аргументов.
Вам также нужно выбирать между std::mem_fun
а также std::mem_fun_ref
в зависимости от того, хотите ли вы иметь дело с указателями или ссылками для объекта класса (соответственно). std::mem_fn
один может справиться с любым из них и даже обеспечивает поддержку умных указателей.
Документация boost::mem_fn
объясняет, когда использовать std::mem_fun
и, проще говоря, именно тогда вам нужно работать с кодом, который ожидает std::mem_fun
или ожидание адаптируемых функторов (что является устаревшим понятием * из C++03). В этих случаях вы не сможете подключить std::mem_fn
либо, так что у вас есть: вы бы использовали std::mem_fun
за наследство.
*: Я имею в виду, что новый код не должен полагаться на протокол C++ 03, например result_type
типы членов (более привычно использовать новые черты типа std::result_of
) - новые объекты вроде std::bind
/std::mem_fn
действительно предоставьте эти члены, если бы они присутствовали в эквивалентном коде C++ 03. Я оставляю это вам, чтобы выяснить, следует ли вам обновить старый код, который опирается на адаптируемые функторы с std::mem_fn
полагаясь на это поведение.