c++ c++11 boost boost-bind stdbind

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 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(<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 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<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?



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 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 anidado ( 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.