c++ - std:: mem_fun vs std:: mem_fn
std function (1)
¿Cuál es la diferencia entre std :: mem_fun y std :: mem_fn ? ¿Por qué es tan confuso el nombramiento?
La documentation de Boost dice que std :: mem_fn puede reemplazar a std :: mem_fun en la mayoría de los casos. Entonces, ¿en qué situación seguirías usando std :: mem_fun?
std::mem_fun
está en desuso. std::mem_fn
puede hacer todo lo que hace, y lo hace más convenientemente. La relación entre los dos es la misma que la relación entre std::bind1st
/ std::bind2nd
y C ++ 11 std::bind
. Tanto std::mem_fn
como std::bind
se desarrollaron y se dominaron después de que std::bind1st
y std::mem_fun
se convirtieran en el estándar C ++ 98. Eso significa que tuvimos que esperar hasta que C ++ 11 reemplazara adecuadamente las cosas viejas con las alternativas superiores.
Por ejemplo, std::mem_fun
solo puede tratar con funciones miembro que toman uno o ningún argumento. std::mem_fn
es variadic y puede tratar con miembros que toman cualquier cantidad de argumentos.
También debe elegir entre std::mem_fun
y std::mem_fun_ref
dependiendo de si desea tratar con punteros o referencias para el objeto de clase (respectivamente). std::mem_fn
solo puede lidiar con cualquiera, e incluso proporciona soporte para punteros inteligentes.
La documentación de boost::mem_fn
explica cuándo usar std::mem_fun
, y en pocas palabras es cuando necesita operar con el código que espera std::mem_fun
, o que espera functors adaptables (que es una noción obsoleta * de C ++ 03). En esos casos, tampoco podría conectar std::mem_fn
, así que ahí lo tiene: usaría std::mem_fun
para legado.
*: Me refiero a que el nuevo código no debe basarse en el protocolo C ++ 03 de tener, por ejemplo, tipos de miembros result_type
(es más habitual usar los nuevos rasgos como std::result_of
) - las nuevas instalaciones como std::bind
/ std::mem_fn
de hecho proporciona esos miembros si hubieran estado presentes en el código equivalente de C ++ 03. Dejo que sepas si debes actualizar el código antiguo que se basa en los funtores adaptables con std::mem_fn
al confiar en este comportamiento.