std::mem_fun против std::mem_fn

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

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


person Scotty    schedule 27.07.2012    source источник


Ответы (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 для устаревших.

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

person Luc Danton    schedule 27.07.2012
comment
std::not1 и std::not2 по-прежнему ожидают этих адаптируемых определений типов. - person Cubbi; 27.07.2012
comment
@Cubbi: Это единственные части C ++ 11, которые все еще работают? - person Scotty; 27.07.2012
comment
@ Скотти, насколько я видел, да, единственные неустаревшие части. И есть около 25 способов создания функторов с этими определениями типов, от std::function и std::mem_fn до std::ref и std::map::value_comp. - person Cubbi; 27.07.2012