为什么使用bind而不是函数调用?
Why use bind instead of function call?
在这种情况下使用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++
方法看起来很好呢?
- 就像@user673679说的,我们不会再失去对实现循环的关注。
- 传统循环创建内部块,多个内部块有时使逻辑难以遵循。
- 你可以在单个元素上重用函数的工作。
相关文章:
- 函数调用中参数的顺序重要吗
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 变量没有改变?通过向量的函数调用
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- 我知道函数调用中存在歧义.有没有办法调用foo()函数
- 模板函数调用
- 获取从C++中同一类中的构造函数调用的方法返回的值
- 析构函数调用
- 成员函数调用和C++对象模型
- 使用共享指针的函数调用,其对象应为 const
- C++:编译时检查匹配的函数调用对?
- 函数调用C++中的参数太少
- 来自 DLL 的函数调用 [表观调用的括号前面的表达式必须具有(指向-)函数类型]
- 返回指向对象的指针的函数调用是否为 prvalue?
- boost::bind()类似的东西,但用于函数调用
- std::bind 是否实现了 std::ref 和 std::cref 来消除函数调用的歧义?
- 调用 'bind(<未解析的重载函数类型>、const std::_Placeholder<1>&、int*) 时没有匹配函数
- C++:BOOST-bind 错误:没有匹配函数来调用 'bind(<未解析的重载函数类型>, ...?
- 为什么使用bind而不是函数调用?