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::bindparece tratar con nombres de funciones sobrecargados en algunas situaciones, mientras questd::bindno 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::bindpuedestd::bindsin problemas a los tipos lambda c ++ 11, mientras queboost::bindpartir 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::bindtiene operadores relacionales sobrecargados ,std::bindno.boost::bindadmite convenciones de llamadas no predeterminadas , no se garantizastd::bind(las implementaciones de bibliotecas estándar pueden ofrecer esto como una extensión).boost::bindproporciona un mecanismo directo para evitar la evaluación entusiasta de expresiones de enlace anidado (boost::protect),std::bindno. (Dicho esto, uno puede usarboost::protectconstd::bindsi lo desea, o trivialmente volver a implementarlo por su cuenta.)std::bindproporciona 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::bindno.