我试图了解这些不同绑定方法之间的区别。boost::bind 和 boost::phoenix::bind也有类似的问题
但是,如果有人可以用例子来解释这一点,那就太好了。boost::phoenix 是否真的是 boost::bind、booost::lambda 库的超集?
我试图了解这些不同绑定方法之间的区别。boost::bind 和 boost::phoenix::bind也有类似的问题
但是,如果有人可以用例子来解释这一点,那就太好了。boost::phoenix 是否真的是 boost::bind、booost::lambda 库的超集?
我认为这个故事是(虽然我还不够大,无法讲述整个故事),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 是多态的,非常强大,非常酷,缺点是编译时间长。
但是,如果有人可以用例子来解释这一点,那就太好了。
什么例子?它们是同一概念的不同实现。
以下是真正重要的:
boost::lambda::bind
也随之发布)以来,Boost.Lambda 已被正式弃用。boost::bind
将在未来被取代boost::phoenix::bind
。它尚未被替换的唯一原因是boost::bind
支持/具有针对旧(读取:损坏)编译器(例如 MSVC6)的解决方法,而 Boost.Phoenix 严格要求符合 C++03 的编译器。结合这两个事实,很明显,在新代码中使用的唯一真正候选者是boost::phoenix::bind
.
boost::phoenix 是否真的是 boost::bind、booost::lambda 库的超集?
是的,这是正确的。