C ++ 11 std :: bind和boost :: bind之间的区别

时间:2012-05-11 16:56:04

标签: c++ c++11 boost boost-bind stdbind

这两者有什么区别吗?或者我可以安全地在我的代码中用boost::bind替换std::bind的每一次出现,从而消除对Boost的依赖吗?

4 个答案:

答案 0 :(得分:86)

  • boost::bind has overloaded relational operatorsstd::bind没有。

  • boost::bind supports non-default calling conventionsstd::bind无法保证(标准库实施可能会将此作为扩展名提供)。

  • boost::bind提供了一种直接机制,允许其人阻止急切评估嵌套绑定表达式(boost::protect),而std::bind则不然。 (也就是说,如果他们愿意,可以将boost::protectstd::bind一起使用,或者可以自己重新实现它。)

  • std::bind提供了一种直接机制,允许用户将任何用户定义的仿函数视为嵌套的绑定表达式,以便强制急切评估(std::is_bind_expression:[ func.bind.isbind] / 1,[func.bind.bind] / 10),boost::bind没有。

答案 1 :(得分:23)

除了其他答案中引用的几个差异外,还有两个不同之处:

  • 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 lambda类型,而boost {1.5}中的boost::bind似乎需要来自用户的输入(除非定义了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,那么您的构建也可能会中断。

答案 2 :(得分:16)

除了上面列出的,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

答案 3 :(得分:8)

我没有完整的答案,但std::bind将使用可变参数模板而不是参数列表。

占位符位于std::placeholders中,而不是std::placeholders::_1,而不是全局命名空间。

我使用

将命名空间别名为stdph
namespace stdph=std::placeholders;

除此之外,我在更新到C ++ 11时没有任何问题