std:: mem fun vs std:: mem fn


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

La documentación 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?

Author: Scotty, 2012-07-27

1 answers

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 el C++11 std::bind. Tanto std::mem_fn como std::bind fueron desarrollados y masterizados después de que std::bind1st y std::mem_fun se convirtieran en el estándar C++98. Así que eso significa que tuvimos que esperar hasta C++11 para reemplazar adecuadamente el material antiguo con las alternativas superiores.

Por ejemplo, std::mem_fun solo puede tratar con funciones miembro que toman uno o no argumento. std::mem_fn es variádico 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 lidiar con cualquiera de los dos, e incluso proporciona soporte para punteros inteligentes.

La documentación de boost::mem_fn explica cuándo usar std::mem_fun, y sencillamente eso es cuando usted necesita para operar con código que espera std::mem_fun, o que espera functors adaptables (que es una noción obsoleta* de C++03). Para esos casos tampoco sería capaz de conectar std::mem_fn, así que ahí lo tienes: usarías std::mem_fun para legacy.

*: Quiero decir que ese nuevo código no debería depender del protocolo C++03 de tener, por ejemplo, tipos de miembros result_type (es más habitual usar los nuevos rasgos como std::result_of) the las nuevas instalaciones como std::bind/std::mem_fn de hecho, proporcione esos miembros si hubieran estado presentes en código C++03 equivalente. Te lo dejo a ti para averiguar si debe actualizar el código antiguo que se basa en funtores adaptables con std::mem_fn confiando en este comportamiento.

 44
Author: Luc Danton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-06 15:47:04