【发布时间】:2010-09-13 03:02:57
【问题描述】:
使用 boost lambda 库开始编程的最佳方式可能是什么。
【问题讨论】:
标签: c++ functional-programming boost-lambda
使用 boost lambda 库开始编程的最佳方式可能是什么。
【问题讨论】:
标签: c++ functional-programming boost-lambda
视情况而定。您是否已经精通函数式编程概念?如果没有,我建议您从专为函数式编程设计的语言开始,而不是使用带有功能特性的过程语言。如果您不习惯以函数式风格进行编码(不一定更难,但肯定会有所不同),那么您将花费更多时间与语法作斗争,而没有足够的时间学习完成工作.
至于从哪里开始,我对 Scheme 的功能有所了解,但有很多不错的选择。
【讨论】:
如果您使用的是相当新的编译器,则可以使用 boost。如果它不在您的机器上,请安装它(sudo apt-get install libboost-dev on unbuntu,如果您在 Windows 上,则从 boost.org 获取二进制文件)。阅读doc,然后查看您现有的代码以了解可能使用它们的情况。例如,如果您使用一小段代码对函数进行参数化,您是否有很多代码重复可以消除?
【讨论】:
在 C++ 语言和库的范围内,我建议首先习惯使用 STL 算法函数模板进行编程,因为 boost::lambda 最常见的用途之一是用内联表达式替换仿函数类内联。
库文档本身为您提供了它的用途的前期示例:
for_each(a.begin(), a.end(), std::cout << _1 << ' ');
其中std::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 真的是正确的解决方案。
【讨论】: