4

使用 boost lambda 库开始编程的最佳方式可能是什么。

4

3 回答 3

17

在 C++ 语言和库的范围内,我建议首先习惯使用 STL 算法函数模板进行编程,因为 boost::lambda 最常见的用途之一是用内联表达式替换仿函数类。

库文档本身为您提供了它的用途的前期示例:

for_each(a.begin(), a.end(), std::cout << _1 << ' ');

wherestd::cout << _1 << ' '产生一个函数对象,当被调用时,它将其第一个参数写入cout流。您可以使用自定义仿函数类std::ostream_iterator或显式循环来执行此操作,但 boost::lambda 在简洁性和清晰度方面胜出——至少如果您习惯于函数式编程概念的话。

当您(过度)使用 STL 时,您会发现自己倾向于 boost::bind 和 boost::lambda。它对以下事情非常方便:

std::sort( c.begin(), c.end(), bind(&Foo::x, _1) < bind(&Foo::x, _2) );

在你到达那一点之前,没有那么多。所以使用 STL 算法,编写自己的函子,然后使用 boost::lambda 将它们转换为内联表达式。

从专业的角度来看,我相信开始使用 boost::lambda 的最佳方式是让 boost::bind 的用法被理解和接受。在 boost::bind 表达式中使用占位符看起来没有“裸”boost::lambda 占位符那么神奇,并且在代码审查期间更容易接受。超出基本的 boost::lambda 使用很可能会让你的同事感到悲伤,除非你在一个前沿的 C++ 商店。

尽量不要太过分——在某些时候和地方,for-loop确实是正确的解决方案。

于 2008-09-25T19:17:18.063 回答
2

依靠。您是否已经精通函数式编程概念?如果没有,我建议您从专为函数式编程设计的语言开始,而不是使用带有功能特性的过程语言。如果您不习惯以函数式风格进行编码(不一定更难,但肯定会有所不同),那么您将花费更多时间与语法作斗争,而没有足够的时间学习完成工作。

至于从哪里开始,我在 Scheme 上切入了我的功能性牙齿,但有很多不错的选择。

于 2008-09-25T15:13:26.747 回答
1

如果您使用的是相当新的编译器,则可以使用 boost。如果它不在您的机器上,请安装它(在 unbuntu 上使用 sudo apt-get install libboost-dev,如果您在 Windows 上,则从 boost.org 获取二进制文件)。阅读文档,然后查看现有代码以了解可能使用它们的情况。例如,如果您使用一小段代码对函数进行参数化,您是否有很多可以消除的代码重复?

于 2008-09-25T15:13:53.920 回答