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

12
我正在尝试理解不同的绑定方法之间的区别。这里有一个类似的问题,可以查看boost::bind和boost::phoenix::bind的区别
但是,如果有人能用示例来解释这个问题,那就太好了。另外,boost::phoenix是否是boost::bind、boost::lambda库的超集?

2
C++11 也内置了 lambda 表达式。最新的 Visual Studio 和 g++ 支持它。你应该将其加入使用! - parapura rajkumar
1
我认为这里的重点是区分Boost提供的不同绑定方法,而不是列举所有可用的lambda函数。 - polapts
你链接的重复问题的答案完美地回答了这个问题。 - Lightness Races in Orbit
2个回答

10

我认为这个故事是(虽然我还不够老,无法讲述整个故事),boost::bind最初是为了替换C++98中难以使用的bind1st/bind2nd而创建的,并且它达到了其目标,现在成为C++11的一部分。但是过去10年中,随着函数式编程风格在C++中的兴起,boost::lambda将其推向了极致(当它被创建时),用纯库方法支持了一个相当广泛的函数构造集合。

从新闻组中我知道作者尝试将boost::lambda和boost::phoenix两个库结合起来,因为它们处理几乎相同的问题。我猜那就是精心设计的boost::phoenix2。

然后出现了boost::proto,它是一个编写表达式模板的库,或者我会说它是一个元库。所以phoenix又再次实现在boost::proto上,然后我们看到了phoenix3。我认为phoenix3在所有上述库中最强大。

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

通过个人经验得出的结论是,如果可用,C++11 lambda表达式是日常工作的选择。它方便、清晰且编译时友好。Phoenix3具有多态性,非常强大、很酷,但缺点是编译时间长。


不错的回答,但有两个小问题。 :-] 1)Boost.Lambda的作者没有直接为任何版本的Phoenix做出贡献,只有影响力。2)如果只包括最小所需的头文件,则Phoenix v3的编译时间实际上比Boost.Lambda更快。 - ildjarn
@RalphZhang,C++14现在支持多态lambda函数。 - alfC

1
但是,如果有人能用例子解释一下就太好了。
例子是关于什么的?它们是同一个概念的不同实现。
以下是真正重要的内容:
1.自从Boost.Phoenix作为独立库发布(当然还有boost::lambda::bind),Boost.Lambda已经被正式弃用。
2.boost::bind的实现将来会被boost::phoenix::bind的实现所取代。之所以还没有被替换,唯一的原因是boost::bind支持/具有旧版编译器(例如MSVC6)的解决方法,而Boost.Phoenix严格要求使用符合C++03标准的编译器。
结合这两个事实,很明显在新代码中唯一可用的选择是boost::phoenix::bind。
此外,boost::phoenix是boost::bind和boost::lambda库的超集,这是正确的。

你说,“boost::bind 的实现将来会被 boost::phoenix::bind 取代。” 实际上这还远没有确定。boost::bind 在设计上非常有限。在它被像 Phoenix 这样范围更大的东西所取代之前,需要进行重要的思考和讨论。 - Eric Niebler
@Eric:这个说法是基于Boost dev ML上的讨论;我手头没有链接,但我记得Beman和Thomas支持替换(这是在Phx v3开发期间,确切的话题是Boost-wide占位符统一),而Peter没有反对。不过,即使Phx v3已经发布了一段时间,似乎也没有朝这个方向有所进展。 :-[ - ildjarn
Boost-wide的占位符统一是我一直想要解决的问题。也许我可以在BoostCon之后关注这个问题。 - Eric Niebler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接