使用 boost::bind 有啥好处?
Posted
技术标签:
【中文标题】使用 boost::bind 有啥好处?【英文标题】:What is the advantage of using boost::bind?使用 boost::bind 有什么好处? 【发布时间】:2021-09-14 00:23:53 【问题描述】:boost::bind
的定义和应用在the boost website 中有明确的概述,但我几乎找不到使用它比使用普通函数调用有什么好处?或者简单地说,在哪些场景下可能派上用场?
【问题讨论】:
查找函数“currying”。你应该找到很多例子。 您使用的是现代 C++ 吗?在 C++11 之前,boost::bind
非常方便,因为我们没有 lambda。随着从 C++11 开始引入 lambda,对 boost::bind
的需求减少了(尽管可能仍有一些用途)
我个人发现它对于简化随机数生成很有用。您必须执行类似myDistribution(randomEngine)
的操作才能获得随机数,为什么不将两者绑定?得到一个简单的rng()
。
@spitconsumer lambda 也可以做到这一点。事实上,在现代 C++ 中几乎没有充分的理由在 lambda 上使用 (boost|std)::bind()
。
我正在检查是否有重复,如果我理解这两个问题的重点,我发现了补充问题。这个问题从知道如何 使用bind
开始,然后问什么时候 会很方便。 The purpose of Function Binding从bind
好用的情况开始,问怎么用。
【参考方案1】:
有时您有一组要传递给函数的参数,但您希望稍后调用该函数而不需要传递已知的参数。需要这样做的一个原因可能是因为调用可能需要符合不允许这些参数的接口。这在(函子风格)“回调”习语中很典型。
这种情况可以通过定义一个将参数存储为成员的类来解决,并定义函数调用运算符重载来委托给原始函数并传递存储为成员的参数。
boost::bind
是一种结构化的方式来表示这种“参数绑定”,而无需自己定义类。标准库曾经有 std::bind1st
和 std::bind2nd
,它们更受限制,bind
的通用形式更少。
boost::bind
在 C++11 中作为 std::bind
被引入标准库,因此不再需要它,此外,lambda 在 C++11 中被引入并在 C++14 中得到改进,它们在很大程度上已经过时bind
.
【讨论】:
我认为第一段不是很清楚。通过指出这是一个与 currying 相当的 functional 构造,可以改进这个答案:仅将一些参数应用于函数以取回只需要的新函数/对象其余未提供的参数以调用它。 @Dúthomhas Curring 是一个类似的概念,但它不是boost::bind
是什么。抽象概念是部分函数应用。虽然知道概念很有用,但知道一个概念的名称并不一定有助于理解它的用途,甚至理解它是什么。
是的,它们都以不同的方式执行相同的概念壮举。给它一个名字可以提供更多有用的谷歌搜索。如果您不喜欢我的建议,也许可以举一个更具体的例子来向新手解释它?【参考方案2】:
bind
提供了一种方法,可以通过精确绑定一个或多个参数来获取具有一定数量的函数或函数对象并将其转换为具有较少数量的另一个函数。而且你可以就地完成。
bind
和函数没有很好的比较。
bind
更类似于调用函数并在其实现中修复某些参数的简单 lambda。
boost::bind
和现代 lambda 之间的最大区别在于,bind
对象具有一定程度的内省,而 lambda 没有。
例如,您原则上可以恢复原始函数并重建参数绑定的内容。 在 lambda 中,一切都是私有的,即使是最简单的实现也是如此。
换句话说,boost::bind
的结果是一个“表达式”,并且该类型具有明确定义的模式(例如boost::bind_t<...>
或其他东西,并且可以在模板函数参数中匹配)。
相反,Lambda 都是它们自己不可知的特殊类型。
诚然,可能很少有人对差异感兴趣,但它就在那里,我用它玩了一两次来实现一个符号系统(用于衍生品)。
我不能对std::bind
说同样的话,因为返回的对象没有被标准指定,重建完整的绑定“表达式”可能更困难。
【讨论】:
以上是关于使用 boost::bind 有啥好处?的主要内容,如果未能解决你的问题,请参考以下文章