std:: mem fun vs std:: mem fn
в чем разница между std:: mem_fun и std:: mem_fn? Почему это название так запутано?
повышение по документация говорит, что std::mem_fn может заменить std:: mem_fun в большинстве случаев. Итак, в какой ситуации вы все равно используете std::mem_fun?
1 ответов
std::mem_fun
устарела. std::mem_fn
может делать все, что он делает, и делает это более удобно. Отношение между ними такое же, как отношение между std::bind1st
/std::bind2nd
и C++11 std::bind
. Оба!--1--> и 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
опираясь на это поведение.