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

时间:2011-11-07 11:27:29

标签: c++ boost boost-bind boost-lambda boost-phoenix

我试图理解这些不同绑定方法之间的区别。 boost::bind and boost::phoenix::bind

也有类似的问题

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

2 个答案:

答案 0 :(得分:10)

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

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

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

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

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

答案 1 :(得分:1)

  

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

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

这是真正重要的:

  1. Boost.Lambda自Boost.Phoenix作为一个独立的库(当然还有boost::lambda::bind)发布以来,已被正式弃用。
  2. boost::bind的实施将来会被boost::phoenix::bind的实施取代。它尚未被替换的唯一原因是boost::bind支持/有旧的(读取:损坏的)编译器的变通方法,例如MSVC6,而Boost.Phoenix严格要求符合C ++ 03的编译器。
  3. 结合这两个事实,很明显,新代码中唯一真正的候选者是boost::phoenix::bind

      

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

    是的,这是正确的。