【问题标题】:Why use bind instead of function call?为什么使用绑定而不是函数调用?
【发布时间】:2014-03-23 15:26:40
【问题描述】:

在这种情况下使用 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 教程提供的简单服务器示例)。

【问题讨论】:

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


    【解决方案1】:

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

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

    如今,使用基于范围的 for 循环,您只需这样做:

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

    算法仍然更适合更复杂的循环(尤其是现在您不必使用 'boost::bind')。

    【讨论】:

      【解决方案2】:

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

      1. 正如@user673679 所说,我们不再专注于实现循环。
      2. 传统上循环创建内部块,多个内部块有时难以遵循逻辑。
      3. 您可以在单个元素上重复使用函数的工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-08-21
        • 1970-01-01
        • 2014-04-11
        • 1970-01-01
        • 2011-09-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多