Diferencia entre C ++ 11 std :: bind y boost :: bind

¿Hay alguna diferencia entre los dos? ¿O puedo reemplazar todas las apariciones de boost::bind by std::bind en mi código y así eliminar la dependencia de Boost?

  • boost::bind tiene operadores relacionales sobrecargados , std::bind no.

  • boost::bind admite convenciones de llamadas no predeterminadas , no se garantiza std::bind (las implementaciones de bibliotecas estándar pueden ofrecer esto como una extensión).

  • boost::bind proporciona un mecanismo directo para evitar la evaluación entusiasta de expresiones de enlace nested ( boost::protect ), std::bind no. (Dicho esto, uno puede usar boost::protect con std::bind si lo desea, o trivialmente volver a implementarlo por su cuenta.)

  • std::bind proporciona un mecanismo directo que permite tratar cualquier functor definido por el usuario como una expresión de enlace anidada para forzar una evaluación ansiosa ( std::is_bind_expression : [func.bind.isbind] / 1, [func.bind.bind ] / 10), boost::bind no.

Además de las varias diferencias citadas en las otras respuestas, aquí hay otras dos diferencias:

  • boost::bind parece tratar con nombres de funciones sobrecargados en algunas situaciones, mientras que std::bind no los trata de la misma manera. Ver c ++ 11 preguntas frecuentes

(usando gcc 4.7.2, boost lib versión 1_54)

 void foo(){} void foo(int i){} auto badstd1 = std::bind(foo); //compile error: no matching function for call to bind() auto badstd2 = std::bind(foo, 1); //compile error: no matching function for call to bind() auto std1 = std::bind(static_cast(foo)); //compiles ok auto std2 = std::bind(static_cast(foo), 1); //compiles ok auto boost1 = boost::bind(foo, 1); //compiles ok auto boost2 = boost::bind(foo); //compiles ok 

Entonces, si simplemente reemplazaste todo boost::bind con std::bind , tu construcción podría romperse.

  • std::bind puede std::bind sin problemas a los tipos lambda c ++ 11, mientras que boost::bind partir de boost 1.54 parece requerir la entrada del usuario (a menos que se defina return_type). Ver boost doc

(usando gcc 4.7.2, boost lib versión 1_54)

 auto fun = [](int i) { return i;}; auto stdbound = std::bind(fun, std::placeholders::_1); stdbound(1); auto boostboundNaive = boost::bind(fun, _1); //compile error. // error: no type named 'result_type' ... auto boostbound1 = boost::bind(fun, _1); //ok boostbound1(1); auto boostbound2 = boost::bind(boost::type(), fun, _1); //ok boostbound2(1); 

Entonces, si simplemente reemplazaste todo std::bind con boost::bind , tu construcción también podría romperse.

Además de lo mencionado anteriormente, boost :: bind tiene un importante punto de extensión: función get_pointer () que permite integrar boost :: bind con cualquier puntero inteligente, por ej. ATL :: CComPtr etc. http://www.boost.org/doc/libs/1_49_0/libs/bind/mem_fn.html#get_pointer

Como resultado, con boost :: bind también puede enlazar un weak_ptr: http://lists.boost.org/Archives/boost/2012/01/189529.php

No tengo la respuesta completa, pero std::bind usará plantillas variadic en lugar de listas de parámetros.

Los marcadores de posición están en std::placeholders como en std::placeholders::_1 lugar del espacio de nombres global.

Me alias el espacio de nombres para stdph con

 namespace stdph=std::placeholders; 

Aparte de eso, no he tenido problemas para actualizar a C ++ 11

    Intereting Posts