C ++ 11 std :: bind和boost :: bind之间的区别
两者有什么区别? 或者我安全地replace每一个boost::bind
的std::bind
在我的代码中,从而消除对Boost的依赖?
-
boost::bind
重载了关系运算符 ,std::bind
没有。 -
boost::bind
支持非默认的调用约定 ,不保证std::bind
(标准库实现可以提供这个扩展)。 -
boost::bind
提供了一个直接的机制来阻止对嵌套绑定expression式(boost::protect
)的急切评估,而std::bind
不会。 (也就是说,如果需要的话,可以使用boost::protect
和std::bind
,或者单独boost::protect
它。) -
std::bind
提供了一个直接的机制,允许将任何用户定义的函子作为一个嵌套的绑定expression式来强制急切的评估(std::is_bind_expression
:[func.bind.isbind] / 1,[func.bind.bind ] / 10),boost::bind
不会。
除了其他答案中引用的几个差异外,还有两点不同之处:
-
boost::bind
似乎在某些情况下处理重载的函数名称,而std::bind
不以相同的方式处理它们。 看看c + + 11常见问题
(使用gcc 4.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
replace所有的boost::bind
std::bind
,你的构build可能会中断。
-
std::bind
可以无缝绑定到c ++ 11 lambdatypes,而boost::bind
as boost 1.54似乎需要用户input(除非定义了return_type)。 请参阅助推文档
(使用gcc 4.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
replace所有的std::bind
boost::bind
,你的构build也可能会中断。
除了上面列出的,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的问题