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

Why use bind instead of function call?

本文关键字:函数调用 bind 为什么      更新时间:2023-10-16

在这种情况下使用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_each可能是一个极端,因为它的for循环实现是最简单的。

在lambda函数出现之前,如果你想在不定义自定义函子的情况下使用算法,'boost::bind'只是一个必要条件。

现在,对于基于范围的for循环,您只需这样做:

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

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

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

  1. 就像@user673679说的,我们不会再失去对实现循环的关注。
  2. 传统循环创建内部块,多个内部块有时使逻辑难以遵循。
  3. 你可以在单个元素上重用函数的工作。