C + + 11 std: : bind 和 ost: : bind 的区别

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

23026 次浏览

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

占位符在 std::placeholders中与在 std::placeholders::_1中一样,而不是在全局名称空间中。

将 stdph 的名称空间作为别名

namespace stdph=std::placeholders;

除此之外,升级到 C + + 11没有任何问题

  • boost::bind 已经重载了关系运算符std::bind没有。

  • boost::bind 支持非默认调用约定std::bind不能保证(标准库实现可以将其作为扩展提供)。

  • boost::bind提供了一种直接机制,允许对嵌套绑定表达式(boost::protect)进行到 预防的热切求值,而 std::bind不允许。(也就是说,如果需要的话,可以使用 boost::protectstd::bind,或者自己重新实现。)

  • std::bind提供了一种直接机制,允许人们将任何用户定义的函数作为嵌套绑定表达式来处理,以便 力量急切求值(std::is_bind_expression: [ fun.bind.isbind ]/1,[ fun.bind.bind ]/10) ,而 boost::bind没有。

除了上面列出的内容之外,ost: : bind 还有一个重要的扩展点: get _ 宫()函数,它允许将 ost: : bind 与任何智能指针集成,例如。ATL: : CComPtr 等。 Http://www.boost.org/doc/libs/1_49_0/libs/bind/mem_fn.html#get_pointer

因此,使用 ost: : bind 还可以绑定弱 _ ptr: Http://lists.boost.org/archives/boost/2012/01/189529.php

除了其他答案中提到的几个不同之处,还有两个不同之处:

  • 在某些情况下,boost::bind似乎可以处理重载的函数名,而 std::bind则不能以同样的方式处理这些函数名。见 C + + 11常见问题

(使用 gcc4.7.2,升级 lib 版本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

因此,如果您简单地用 std::bind替换所有 boost::bind,您的构建可能会中断。

  • std::bind可以无缝地绑定到 c + + 11 lambda 类型,而 boost::bind在升级1.54时似乎需要来自用户的输入(除非定义 return _ type)。见 托博士

(使用 gcc4.7.2,升级 lib 版本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);

因此,如果您简单地用 boost::bind替换所有 std::bind,您的构建也可能中断。