Подтвердить что ты не робот

Std:: mem_fun vs std:: mem_fn

В чем разница между std:: mem_fun и std:: mem_fn? Почему это так запутанно?

Boost сообщает, что std:: mem_fn может в большинстве случаев заменить std:: mem_fun. Итак, в какой ситуации вы все равно будете использовать std:: mem_fun?

4b9b3361

Ответ 1

std::mem_fun устарел. std::mem_fn может делать все, что он делает, и делает это более удобно. Отношение между ними совпадает с отношением между std::bind1st/std::bind2nd и С++ 11 std::bind. И std::mem_fn, и std::bind были разработаны и освоены после std::bind1st и std::mem_fun были сделаны в стандарте С++ 98. Это значит, что нам пришлось подождать, пока С++ 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, или который ожидает адаптируемых функторов (что является устаревшим понятием * из С++ 03). Для этих случаев вы не сможете подключить std::mem_fn, так что там у вас есть: вы использовали бы std::mem_fun для наследия.

*: Я имею в виду, что новый код не должен полагаться на протокол С++ 03, например, result_type типы членов (более привычно использовать новые черты, такие как std::result_of) - новые объекты, такие как std::bind/std::mem_fn, действительно предоставляют эти члены, если бы они присутствовали в эквивалентном С++ 03 код. Я оставлю это вам, чтобы выяснить, следует ли обновлять старый код, который полагается на адаптируемые функторы с помощью std::mem_fn, полагаясь на это поведение.