C++是一门博大高深的语言,提供了众多编程模式,以及其技术,其中有一项重要的技术,叫做模板技术。所谓的模板,就是提供一套函数或类,其中参数或成员是没有定义为特定类型,由使用者来定义它的类型。最开始这项技术主要用来解决容器类的问题,比如int、float类型的容器,就需要编写两个类才能解决。而采用模板技术之后,就算有N种类型,只需编写一个容器类就解决了,这样不仅提高了开发效率,也减少了代码的编写量,提高了维护性。下面介绍学习的boost库,就是使用模板技术来实现的,如果对模板技术还不够熟悉,建议先找相关的书本学习,再来学习本书里的内容。由于C++只是定义了一门语言,没有定义标准的类库,结果导致越来越不适应现代技术的发展,对代码的高质量,对解决问题的技术积累都落后在其它语言后面,比如JAVA、C#,它们都提供了大量基础类库,因此C++的类库也提到日程上了,在这段时间里,C++出现了STL类库,但还是很弱小、功能有限,紧接着业界就提供了一个强大的boost类库。熟练地使用boost库会提高软件的开发效率,提高代码的质量,提高开发人员多平台开发能力,因而会使用boost库,已经成为现代C++开发人员的一项基本技能了。
boost库里有很多吸引人的地方,但也比较多内容,比较复杂一些。为了有一个简单印象,先介绍一个简单的例子,通过这个例子看到,怎么样大大地提高开发效率。为此,从一个lambda表达式使用的例子开始吧。什么是lambda表达式,其实就是一个匿名函数。当你需要一个函数,并且只想使用一次时,但又不想声明这个函数,也不关心这个函数的名称,就可以使用这种表达方式。其实在编译器里,还是会自动生成这个函数的。使用lambda表达式的好处是可以提高开发效率,提高类型安全,提供更加局部化的作用域代码。
现在假设有一个问题,需要从键盘输入多个数字,并且通过乘以3倍后,再输出到控制台。
习惯的做法是如下:
//
class CMul
{
public:
void operator()(const int v)
{
std::cout << v * 3 << " ";
}
};
这里先声明一个函数操作对象,在对象里实现乘法,并输到控制台。
然后使用下面的语句,就可以把输入的一系数字串进行运算,并输出到控制台。
std::for_each(in(std::cin), in(), CMul());
比如输入:1 2 4
输出为:3 6 12
使用lambda表达式的做法是如下:
using namespace boost::lambda;
std::for_each(in(std::cin), in(), std::cout << (_1 * 3) <<" ");
上面的代码通过引入boost库的lambda库,就可以简单到一行代码实现了上面的功能,并且阅读起来更加直接,更加优美很多。可见boost库会提高效率,不仅是编程效率,还会提高维护的效率,感觉如何?因此会从心底里爱上boost库的。
整例子完整的代码如下:
// boost_001.cpp : Defines the entry point for the console application. // #include "stdafx.h" // #include <boost/lambda/lambda.hpp> #include <iostream> #include <iterator> #include <algorithm> // class CMul { public: void operator()(const int v) { std::cout << v * 3 << " "; } }; int _tmain(int argc, _TCHAR* argv[]) { typedefstd::istream_iterator<int> in; //使用传统方式 std::for_each(in(std::cin), in(),CMul()); //复位cin; if (std::cin.fail()) { std::cin.clear(); std::cin.sync(); } //使用lambda表达式 using namespace boost::lambda; std::for_each(in(std::cin), in(),std::cout << (_1 * 3) << " "); system("pause"); return 0; }
作者: 蔡军生
QQ:9073204