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
для устаревших.
*: Я имею в виду, что этот новый код не должен полагаться на протокол С++ 03, т.е. result_type
типы членов (более привычно использовать новые признаки, такие как std::result_of
) -- новые средства, такие как std::bind
/std::mem_fn
, фактически предоставляют эти члены, если бы они присутствовали в эквивалентном коде C++03. Я оставляю вам решать, стоит ли вам обновлять старый код, основанный на адаптируемых функторах, с помощью std::mem_fn
, полагаясь на это поведение.
person
Luc Danton
schedule
27.07.2012