std::mem_fun vs std::mem_fn

В чем разница между 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++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 за наследство.

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

Другие вопросы по тегам