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


Answers

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

  • 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

因此,如果您只是用std::bind替换所有boost::bind std::bind ,那么您的构建可能会中断。

  • std::bind可以无缝绑定到c ++ 11 lambda类型,而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);

所以,如果你只是用boost::bind替换所有std::bind boost::bind ,你的构建也可能会破坏。

Question

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




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

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

我将命名空间别名为stdph with

namespace stdph=std::placeholders;

除此之外,我没有遇到更新到C ++ 11的问题




Related