СТД::мэм удовольствие против СТД::мэм ФН


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

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

1 28

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 для legacy.

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