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

C++ 为什么使用bind而不是函数调用?,c++,c++11,boost,bind,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) (

在这种情况下使用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);



(这是boost教程提供的一个简单的服务器示例)。

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

在lambda函数之前,“boost::bind”只是一个要求,如果您想使用该算法而不定义自定义函子的话

现在,使用基于范围的for循环,您只需执行以下操作:

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

不过,对于更复杂的循环,算法仍然更好(尤其是现在不必使用“boost::bind”)。

这两种算法的作用相同<代码>boost::bind创建一个函数对象,它的工作原理主要类似于
C
中的函数指针。因此,问题可能是他们为什么要用
C++
的方式来做这件事
C++
是一种面向对象的语言,它与标准库(STL)一起提供 数据结构(称为类),如容器(列表、集合、映射、迭代器概念等)和其他实用程序。它还提供用于该类的算法(查找、排序、筛选等)。因此,要使算法以统一的方式处理这些容器,容器必须遵循一些规则。
std::for_每个
都是STL算法的一部分,所以它就是这样工作的。
但是为什么
C++
的方式看起来不错呢

  • 正如@user673679所说,我们不会再失去对实现循环的关注
  • 传统上,循环创建内部块,几个内部块有时会使遵循逻辑变得困难
  • 您可以在单个元素上重用函数的工作