我试图理解这些不同绑定方法之间的区别。 boost::bind and boost::phoenix::bind
也有类似的问题但是,如果有人能用例子解释这一点,那就太好了。也就是说,boost :: phoenix是boost :: bind,booost :: lambda库的超集吗?
答案 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)
但是,如果有人能用例子解释这一点,那就太好了。
什么样的例子?它们是同一概念的不同实现。
这是真正重要的:
boost::lambda::bind
)发布以来,已被正式弃用。boost::bind
的实施将来会被boost::phoenix::bind
的实施取代。它尚未被替换的唯一原因是boost::bind
支持/有旧的(读取:损坏的)编译器的变通方法,例如MSVC6,而Boost.Phoenix严格要求符合C ++ 03的编译器。结合这两个事实,很明显,新代码中唯一真正的候选者是boost::phoenix::bind
。
也就是说,boost :: phoenix是boost :: bind,booost :: lambda库的超集吗?
是的,这是正确的。