为什么使用bind而不是函数调用?

时间:2014-03-23 15:26:41

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

在这种情况下使用boost :: bind有什么好处

std::for_each(participants_.begin(), participants_.end(),
    boost::bind(&chat_participant::deliver, _1, boost::ref(msg)));

而不是

for(iterator actual = participants_.begin(); actual != participants_.end(); ++actual)
    (*actual)->deliver(msg);



Link to the whole code(这是一个由boost教程提供的简单服务器示例)。

2 个答案:

答案 0 :(得分:8)

我认为只是在C ++ 11之前,算法通常被推荐用于大多数事情的简单for循环。从理论上讲,理解代码的目的更容易,因为您不必首先理解整个循环实现。 for_each可能是一个极端,因为它的for循环实现将是最简单的。

在lambda函数之前,如果你想在没有定义自定义函子的情况下使用算法,'boost :: bind'只是一个要求。

如今,使用基于范围的for循环,您只需执行此操作:

for (auto& participant : participants)
    participant->deliver(msg);

虽然算法对于更复杂的循环仍然更好(特别是现在你不必使用'boost :: bind')。

答案 1 :(得分:2)

他们两人都做同样的工作。 boost::bind创建一个函数对象,它的作用大致类似于C中的函数指针。所以问题可能就是为什么他们以C++方式做到这一点 C++是一种面向对象的语言,它带有标准库(STL),它提供了几种 数据结构(称为类),如容器(列表,集合,映射,迭代器概念等)和其他实用程序。它还提供了适用于该类的算法(查找,排序,过滤..等)。因此,对于以统一方式使用这些容器的算法,容器必须遵循一些规则 std::for_each是STL算法的一部分,因此它的工作方式也是如此 但为什么C++方式看起来不错?

  1. 正如@ user673679所说,我们不再专注于实施循环。
  2. 传统上,循环创建内部块,有时会使几个内部块难以遵循逻辑。
  3. 您可以重复使用这些功能'关于单一元素的工作。