std::mem_fun
jest przestarzałe. std::mem_fn
może zrobić wszystko, co robi, i robi to wygodniej. Relacja między nimi jest taka sama jak relacja między std::bind1st
/std::bind2nd
a C++ 11 std::bind
. Zarówno std::mem_fn
, jak i std::bind
zostały opracowane i opanowane po tym, jak std::bind1st
i std::mem_fun
zostały wykonane w standardzie C++ 98. Oznacza to, że musieliśmy poczekać, aż C++ 11 odpowiednio zamieni stare rzeczy na lepsze alternatywy.
Na przykład std::mem_fun
może zajmować się tylko funkcjami składowymi, które przyjmują jeden argument lub nie zawierają żadnych argumentów. std::mem_fn
jest wariantowa i może obsługiwać członków, którzy przyjmują dowolną liczbę argumentów.
Należy również wybrać między std::mem_fun
i std::mem_fun_ref
w zależności od tego, czy chce się zajmować wskaźnikami, czy też odniesieniami do obiektu klasy (odpowiednio). std::mem_fn
sam może sobie poradzić, a nawet zapewnia wsparcie dla inteligentnych wskaźników.
Dokumentacja boost::mem_fn
wyjaśnia kiedy używać std::mem_fun
, i umieścić po prostu to jest, gdy trzeba pracować z kodem, który spodziewa std::mem_fun
, lub że spodziewa adaptacyjnych funktory (co jest przestarzałe pojęcie * z C++ 03). W tych przypadkach nie można też podłączyć std::mem_fn
, więc masz go: używałbyś std::mem_fun
dla starszej wersji.
*: Chodzi mi o to, że ten nowy kod nie powinien polegać na protokole C++ 03 posiadania np. result_type
typy członków (bardziej zwyczajowo jest używać nowych cech, takich jak std::result_of
) - nowe urządzenia, takie jak std::bind
/std::mem_fn
, w rzeczywistości dostarczają tych członków, którzy byliby obecni w równoważnym kodzie C++ 03. Pozostawiam to tobie, aby dowiedzieć się, czy powinieneś zaktualizować stary kod, który opiera się na adaptowalnych funktorach z std::mem_fn
, opierając się na tym zachowaniu.
'std :: not1' i' std :: not2' nadal oczekują tych "adaptowalnych" typów. – Cubbi
@Cubbi: Czy są one jedynymi częściami C++ 11, które wciąż są? – Scotty
@Scotty o ile widziałem, tak, jedyne niezamówione części. Istnieje również 25 sposobów na tworzenie funktorów z tymi typedef, od 'std :: function' i' std :: mem_fn' do 'std :: ref' i' std :: map :: value_comp'. – Cubbi