¿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