【问题标题】:boost::function and boost::bind are cool, but what is really cool about boost::lambda?boost::function 和 boost::bind 很酷,但是 boost::lambda 真正酷的是什么?
【发布时间】:2011-01-11 04:11:47
【问题描述】:

Effective C++ Meyers 的第 175 页第 1 段中谈到了广义函子和绑定:

我发现tr1::function 可以让你做什么 太神奇了,让我全身发麻 超过。如果你没有刺痛,它可能 因为你盯着 ...的定义,想知道什么是 继续……

我同意他的绑定和功能。关于 lambda,嗯,我了解 lambda 的作用以及它是如何做到的,但是有人可以发布一本书式的令人兴奋的 sn-p 或一个口头大纲,说明为什么 lambda 应该(用迈耶斯的术语)让我大吃一惊吗?我之所以这么问,是因为 C++ 中使用占位符语法的每个领域对我来说都像是一个 hack(是的,我对函数式方法足够了解,所以请不要基础),我同意它的使用方式在绑定和 MPL 中;但是,在 lambda 的情况下,我只是希望它是合理的,这样我就可以决定天气我应该将它输入到我的曲目中。

-- 编辑--

This SO answer 提到了仅使用占位符语法的仿函数的内联创建,他提到了高级用法,这可能就是我所追求的……在高级用法中,它仍然只是内联创建仿函数吗?

【问题讨论】:

  • 您阅读过 BLL 文档吗?有很多例子在我第一次阅读时让我大吃一惊。例如:sort(a, b, _1 < _2);。然后搜索 SO。
  • (+1) 是的,我做到了(至少前 10 页)——而且我理解这种用法​​。是这样吗?
  • Lambdas 都是关于匿名函数的内联创建,而 Boost.Lambda 在讨论 C++0x lambdas 包含之前就为您提供了执行此操作的工具 - 所以我不会说 “就是这样?”(嘿,不要声称我的 +1 ;)
  • BB 和 BLL 是分开进化的,因此是重叠的。请参阅boost.org/doc/libs/1_41_0/doc/html/lambda/s08.html——这应该可以消除任何混淆。
  • 谢谢大家:尽管=D,您应该已经做出了答案,但是很难接受三个答案中的任何一个。我想我会使用 lambda 来做一些简单的事情——我只是在阅读文档,因为我遵循了精神的参考。我希望他们将函数式编程硬连接到语言中——包括精神让我的编译器屈服。

标签: c++ boost functional-programming boost-lambda


【解决方案1】:

根据上面留下的cmets,以及问题中的链接,以下是我接受的答案(社区wiki):

  1. Boost.Lambda 满足了内联仿函数创建的目的(这是我喜欢的术语)。这个功能可以通过 Function + Bind 来填充,但它比它需要的更冗长,而且对于简单的函子,这是不必要的——例如,上面的 cmets 中显示的排序。

  2. Function-Bind 对和 Lambda 之间显然存在语义重叠——这是一个历史产物,并且因为 Lambda 有其存在的理由,它存在于 Boost 中。

【讨论】:

    【解决方案2】:

    关于它的“酷”之处在于,与 boost foreachboost 参数 一样,将语法注入/扩展到 C++ 中,而 C++ 中不存在该语言,即它直接模拟匿名函数作为参数。

    【讨论】:

    • 好吧,另一种选择是用你自己发明的语言编写你自己的编译器。
    • 你看错了 ima,这根本不是使用 C++ 的原因,而是为什么这部分还不是 C++ 语法的原因。 C++0x lambda 表达式真的很酷,但它们只是朝着编译器支持的迭代器和迭代它们迈出了一小步。
    猜你喜欢
    • 1970-01-01
    • 2010-10-06
    • 1970-01-01
    • 1970-01-01
    • 2016-03-16
    • 1970-01-01
    • 1970-01-01
    • 2012-04-18
    • 1970-01-01
    相关资源
    最近更新 更多