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 опираясь на это поведение.