СТД::мэм удовольствие против СТД::мэм ФН
В чем разница между std::mem_fun и std::mem_fn? Почему это название так запутанно?
Документация Boost говорит, что std::mem_fn может заменить std::mem_fun в большинстве случаев. Итак, в какой ситуации вы бы все еще использовали std::mem_fun?
1 ответ:
std::mem_fun
является устаревшим.std::mem_fn
может делать все, что он делает, и делает это более удобно. Отношение между ними такое же, как и отношение между ними.std::bind1st
/std::bind2nd
и C++11std::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
для legacy.*: я имею в виду, что новый код не должен полагаться на протокол C++03, например,
result_type
типы членов (более привычно использовать новые черты, такие какstd::result_of
) - новые средства, такие какstd::bind
/std::mem_fn
действительно, предоставьте эти члены, если бы они присутствовали в эквивалентном коде C++03. Я оставляю это тебе. чтобы выяснить, следует ли обновлять старый код, который полагается на адаптируемые функторы с помощьюstd::mem_fn
, полагаясь на это поведение.