问题 boost :: bind,boost :: lambda :: bind和boost :: phoenix :: bind之间的区别


我试图理解这些不同绑定方法之间的区别。有类似的问题 boost :: bind和boost :: phoenix :: bind 

但是,如果有人能用例子解释这一点,那就太好了。也就是说,boost :: phoenix是boost :: bind,booost :: lambda库的超集吗?


11587
2017-11-07 11:27


起源

C ++ 11还内置了lamba语言。最新的Visual Studio和g ++支持它。你应该添加它! - parapura rajkumar
我认为这里的重点是区分由boost提供绑定的各种方法,而不是招募所有可用的lambda。 - polapts
您链接的副本的答案完美答案 这个 问题也是。 - Lightness Races in Orbit


答案:


我认为这个故事是(虽然我还不够讲述整个故事),但首先创建了boost :: bind来替换C ++ 98中难以使用的bind1st / bind2nd,它实现了它的目标,现在是C ++ 11的一部分。 但是在过去10年里,随着C ++中函数式编程风格的兴起,boost :: lambda推动它到目前为止(在创建时),它支持C ++中使用纯库方法的相当广泛的函数结构集。

然后我从新闻组了解到,boost :: lambda和boost :: phoenix的作者试图将这两个库结合起来,因为它们处理的问题几乎相同。我猜那是设计精美的boost :: phoenix2

然后是boost :: proto,它是一个用于编写表达式模板的库,或者我说它是一个元库。所以凤凰必杀技再次在boost :: proto上重生,然后我们看到了phoenix3。我认为phoenix3是上述最强大的。

另一方面,C ++ 11增加了对lambda表达式的语言支持,我个人认为它非常有用且方便。唯一的缺点是它不是多态的(而phoenix3允许创建多态函数对象)。

作为我个人经验的结论,如果可以的话,C ++ 11 lambda表达式是日常工作的选择。它方便,清晰,编译时友好。 Phoenix3是多变的,非常强大,非常酷,具有编译时间长的缺点。


10
2017-11-09 01:29



很好的答案,但两个小尼特。 : - ] 1)Boost.Lambda的作者没有直接贡献任何版本的凤凰城,只有影响力。 2)Phoenix v3的编译时间实际上比Boost.Lambda快,如果你只包含最小的必需头文件。 - ildjarn
@RalphZhang,C ++ 14现在有多态lambda - alfC


但是,如果有人能用例子解释这一点,那就太好了。

什么例子?它们是同一概念的不同实现。

这是真正重要的:

  1. 自Boost.Phoenix作为一个独立的库发布以来,Boost.Lambda已被正式弃用(当然 boost::lambda::bind 随之而来)。
  2. 实施 boost::bind 将被替换为 boost::phoenix::bind 在将来。它尚未被替换的唯一原因是 boost::bind 支持/有旧的(读取:损坏)编译器的变通方法,例如MSVC6,而Boost.Phoenix严格要求符合C ++ 03的编译器。

结合这两个事实,很明显,新代码中唯一真正的候选者是 boost::phoenix::bind

也就是说,boost :: phoenix是boost :: bind,booost :: lambda库的超集吗?

是的,这是正确的。


1
2017-11-09 01:43



你说,“boost :: bind的实现将来会被boost :: phoenix :: bind的替换。”这实际上远非确定。根据设计,Boost :: bind的功能非常有限。首先需要进行重要的思考和讨论才能取代凤凰城这样规模更大的东西。 - Eric Niebler
@Eric:该声明基于Boost dev ML上的对话;我没有方便的链接,但我的回忆是Beman和Thomas赞成替换(这是在Phx v3开发期间,确切的话题是Boost范围的占位符统一),并且彼得没有异议。但是,即使Phx v3已经停用了一段时间,也没有朝这个方向发展。 : - [ - ildjarn
扩展占位符统一是我一直想要解决的问题。也许我可以在BoostCon之后给这个问题一些关注。 - Eric Niebler