2012-07-27 29 views
25

¿Cuál es la diferencia entre std :: mem_fun y std :: mem_fn? ¿Por qué el nombramiento es tan confuso?std :: mem_fun vs std :: mem_fn

Boost documentation dice que std :: mem_fn puede reemplazar std :: mem_fun en la mayoría de los casos. Entonces, ¿en qué situación seguirías usando std :: mem_fun?

Respuesta

40

std::mem_fun está obsoleto. std::mem_fn puede hacer todo lo que hace, y lo hace de manera más conveniente. La relación entre los dos es la misma que la relación entre std::bind1st/std::bind2nd y C++ 11 std::bind. Ambos std::mem_fn y std::bind se desarrollaron y 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 C++ 11 para reemplazar correctamente las cosas viejas con las alternativas superiores.

Por ejemplo, std::mem_fun solo puede tratar con funciones de miembros que toman uno o ningún argumento. std::mem_fn es variadic y puede tratar con miembros que toman cualquier número 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 manejar cualquiera de los dos, e incluso proporciona soporte para punteros inteligentes.

La documentación de boost::mem_fn explica cuándo utilizar std::mem_fun, y en pocas palabras que es cuando se necesita para operar con el código que espera std::mem_fun, o que se espera funtores adaptables (que es una noción obsoleta * desde C++ 03). Para esos casos, tampoco podría enchufar std::mem_fn, así que ahí lo tiene: usaría std::mem_fun para legado.

*: me refiero a que ese nuevo código no debe depender del protocolo C++ 03 de tener, p. result_type tipos de miembros (es más habitual usar los nuevos rasgos como std::result_of) - las nuevas instalaciones como std::bind/std::mem_fn de hecho proporcionan esos miembros si hubieran estado presentes en el código C++ 03 equivalente. Dejo en tus manos averiguar si debes actualizar el código anterior que se basa en funtores adaptables con std::mem_fn confiando en este comportamiento.

+2

'std :: not1' y' std :: not2' todavía esperan esos typedefs "adaptables". – Cubbi

+0

@Cubbi: ¿Son las únicas partes de C++ 11 que todavía funcionan? – Scotty

+1

@Scotty por lo que he visto, sí, las únicas partes no en desuso. Y hay unas 25 formas de crear funtores con esos typedefs, desde 'std :: function' y' std :: mem_fn' a 'std :: ref' y' std :: map :: value_comp'. – Cubbi

Cuestiones relacionadas