2012-07-27 28 views
25

Jaka jest różnica między std :: mem_fun i std :: mem_fn? Dlaczego nazewnictwo jest tak mylące?std :: mem_fun vs std :: mem_fn

Boost's documentation mówi, że std :: mem_fn może w większości przypadków zastąpić std :: mem_fun. Więc w jakiej sytuacji nadal używasz std :: mem_fun?

Odpowiedz

40

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.

+2

'std :: not1' i' std :: not2' nadal oczekują tych "adaptowalnych" typów. – Cubbi

+0

@Cubbi: Czy są one jedynymi częściami C++ 11, które wciąż są? – Scotty

+1

@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

Powiązane problemy