Разница между C++11 std:: bind и boost:: bind



есть ли разница между двумя? Или я в безопасности, чтобы заменить каждое вхождение boost::bind by std::bind в моем коде и тем самым убрать зависимость от Boost?

681   4  

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

    Ничего не найдено.