boost::bind、boost::lambda::bind和boost::phoenix::bind的区别
Difference between boost::bind, boost::lambda::bind and boost::phoenix::bind
我试图理解这些不同绑定方法之间的区别。boost::bind和boost::phoenix::bind
也有类似的问题但是,如果有人可以用例子来解释这一点,那就太好了。另外,boost::phoenix是不是boost::bind、boost:: lambda库的超集?
我认为事情是这样的(尽管我还不够老,不能讲完整的故事),boost::bind最初是为了取代c++ 98中难以使用的bind1st/bind2nd而创建的,它实现了它的目标,现在是c++ 11的一部分。但是在过去的10年里,函数式编程风格在c++中兴起,boost::lambda推动了函数式编程风格的发展(在它被创建的时候),它在c++中用纯库的方式支持了相当广泛的函数式结构。
然后,我从新闻组了解到,boost::lambda和boost::phoenix的作者试图将这两个库结合起来,因为它们处理几乎相同的问题。我猜那是设计精美的boost::phoenix2
然后是boost::proto,这是一个编写表达式模板的库,或者我应该说它是一个元库。于是凤凰再次涅槃,重生于boost::proto之上,于是我们看到了凤凰。我认为凤凰是最强大的。
另一方面,c++ 11增加了对lambda表达式的语言支持,我个人认为这非常有用和方便。唯一的缺点是它不是多态的(而phoenix3允许创建多态函数对象)。
作为我个人经验的结论,c++ 11 lambda表达式是日常工作的选择,如果可用的话。它方便、清晰且编译时友好。Phoenix3是多态的,非常强大,非常酷,缺点是编译时间过长。
但是,如果有人能用例子来解释这一点,那就太好了。
什么例子?它们是同一概念的不同实现。
重要的是:
- 提振。从Boost开始,Lambda就被正式弃用了。Phoenix是作为一个独立的库发布的(当然
boost::lambda::bind
也是如此)。 - 未来
boost::bind
的实施将被boost::phoenix::bind
取代。它还没有被替换的唯一原因是boost::bind
支持/有旧的(读:坏的)编译器的解决方案,例如MSVC6,而Boost。Phoenix严格要求c++兼容编译器。
结合这两个事实,很明显,在新代码中使用的唯一真正候选是boost::phoenix::bind
。
boost::phoenix是不是boost::bind、boost:: lambda库的超集?
- boost::bind()类似的东西,但用于函数调用
- 泛化传递给 boost::bind 的参数
- boost::bind函数缓冲区的最大大小
- 自 1.55 以来,boost::bind / boost::function 中的奇怪行为变化
- 使用 boost::bind 进行订阅回调时出错
- 如何使用 boost::bind 附加参数?
- boost::bind 无法绑定到纯虚拟基类中定义的非静态函数模板成员类型
- 如何正确绑定成员函数与 boost::bind
- 将 boost::function 和 boost::bind 替换为模板
- Boost Asio - boost::bind 导致程序崩溃
- 我可以使用 boost::bind 来存储不相关的对象吗?
- 在spirit parser Action中,在上下文参数上编译boost :: bind(成员函数)上的错误
- 如何使用 boost::bind 将返回 int 的函数转换为返回布尔值的函数
- boost::bind with member functions(作为boost::asio异步写入处理程序)
- 创建一个 boost::线程 带有 boost::bind() 或不带
- 如何使用 boost::bind 将静态成员函数绑定到 boost::function
- 为什么这"boost::bind"不编译?
- 访问Boost Bind时,共享库中的C 符号查找错误
- 使用 Boost.Bind 打印矢量元素
- 编译 Boost.Bind时出错