Diferencia entre C++ 11 std:: bind y boost:: bind
c++11 boost-bind (4)
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 questd::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(<unresolved overloaded function type>)
auto badstd2 = std::bind(foo, 1);
//compile error: no matching function for call to bind(<unresolved overloaded function type>)
auto std1 = std::bind(static_cast<void(*)()>(foo)); //compiles ok
auto std2 = std::bind(static_cast<void(*)(int)>(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
puedestd::bind
sin problemas a los tipos lambda c ++ 11, mientras queboost::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<int>(fun, _1); //ok
boostbound1(1);
auto boostbound2 = boost::bind(boost::type<int>(), fun, _1); //ok
boostbound2(1);
Entonces, si simplemente reemplazaste todo std::bind
con boost::bind
, tu construcción también podría romperse.
¿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?
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
boost::bind
tiene operadores relacionales sobrecargados ,std::bind
no.boost::bind
admite convenciones de llamadas no predeterminadas , no se garantizastd::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 anidado (boost::protect
),std::bind
no. (Dicho esto, uno puede usarboost::protect
constd::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.