4 ответов:
boost::bindимеет перегруженные операторы,std::bindнет.
boost::bindподдерживает соглашения о вызовах не по умолчанию,std::bindне гарантируется (стандартные реализации библиотеки могут предлагать это как расширение).
boost::bindобеспечивает прямой механизм, чтобы позволить одному запретить нетерпеливая оценка вложенных выражений привязки (boost::protect),std::bindнет. (Тем не менее, можно использоватьboost::protectСstd::bindесли они хотят, или тривиально реализовать его самостоятельно.)
std::bindпредоставляет прямой механизм, позволяющий обрабатывать любой пользовательский функтор как вложенное выражение привязки, чтобы силу нетерпеливой оценке (std::is_bind_expression: [func.связывать.isbind]/1, [func.связывать.bind] / 10),boost::bindнет.
помимо нескольких различий, приведенных в других ответах, вот еще два различия:
boost::bindпохоже, в некоторых ситуациях имеет дело с перегруженными именами функций, тогда какstd::bindне бороться с ними таким же образом. Смотрите в C++11 FAQ по(используя gcc 4.7.2, boost lib version 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так что если вы просто заменили все
boost::bindСstd::bindсборка может сломаться.
std::bindможно легко привязать к C++11 типов лямбда, в то время какboost::bindпо состоянию на boost 1.54, кажется, требует ввода от пользователя (если return_type не определен). Смотрите boost doc(используя gcc 4.7.2, boost lib version 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);Итак, если вы просто заменили все
std::bindСboost::bind, ваша сборка также может сломаться.
Кроме перечисленных выше, boost:: bind имеет важную точку расширения:get_pointer() функция, которая позволяет интегрировать boost:: bind с любым смарт-указателем, например. ATL:: CComPtr и др. http://www.boost.org/doc/libs/1_49_0/libs/bind/mem_fn.html#get_pointer
в результате, с boost:: bind вы также можете связать weak_ptr: http://lists.boost.org/Archives/boost/2012/01/189529.php
у меня нет полного ответа, но
std::bindбудет использовать вариативные шаблоны, а не списки параметров.заполнители находятся в
std::placeholdersа вstd::placeholders::_1а не глобальное пространство имен.Я псевдоним пространства имен для stdph с
namespace stdph=std::placeholders;кроме того, у меня не было проблем с обновлением до C++11
Comments