第18章探讨C++新标准,语言变化,Boost 项目,TR1,使用 Boost
第18章探讨C++新标准,语言变化,Boost 项目,TR1,使用 Boost
文章目录
18.8 语言变化
计算机语言是如何成长和发展的呢?C++的使用范围足够广后,显然需要国际标准,并将其控制权交给标准委员会:最初是ANSI委员会,随后是ISO/ANSI联合委员会,当前是ISO/ECITC1/SC22/WG21(C+标准委员会)。ISO是国际标准组织,IEC是国际电子技术委员会,JEC1是前两家组织组建的联合技术委员会1,SC22是JTC1下属的编程语言委员会,而WG21是SC22下属的C++工作小组。委员会考虑缺陷报告和有关语言修改和扩展的提议,并试图达成一致。这个过程既繁琐又漫长,《TheDsign and Evolution ofC++》(Stroustrup,Addison-Wesley,1994)介绍了这方面的一些情况。寻求一致的委员会沉闷而争议不断,可能不是鼓励创新的好方式,这也不是标准委员会应扮演的角色。但就 C++而言,还有另一种变更的途径,那就是充满创意的 C++编程社区的直接行动。程序员无法不受羁绊地改进语言,但可创建有用的库。设计良好的库可改善语言的用途和功能,提高可靠性,让编程更容易、更有乐趣。库是在现有语言功能的基础上创建的,不需要额外的编译器支持。如果库是通过模板实现的,则可以头文件(文本文件)的方式分发。
一项这样的变革是 STL,它主要是Alexander Stepanov创建的,Hewlett-Packard 免费提供它。STL在编程社区获得了巨大成功,成了第一个ANSIISO 标准的候选内容。事实上,其设计影响新标准的其他方面。
18.8.1 Boost 项目
最近,Boost库成了C++编程的重要部分,给C++11带来了深远影响。Boost项目发起于1998年,当时的C++库工作小组主席 Beman Dawes 召集其他几位小组成员制定了一项计划,准备在标准委员会的框架外创建新库。该计划的基本理念是,创建一个充当开放论坛的网站,让人发布免费的C++库。这个项目提供有关许可和编程实践的指南,并要求对提议的库进行同行审阅。其最终的成果是,一系列得到高度赞扬和广泛使用的库。这个项目提供了一个环境,让编程社区能够检验和评估编程理念以及提供反馈。
18.8.2 TR1
TR1(Technical Report1)是C++标准委员会的部分成员发起的一个项目,它是一个库扩展选集,这些扩展与 C++98标准兼容,但不是必不可少的。这些扩展是下一个C++标准的候选内容。TR1库让 C++社区能够检验其组成部分的价值。当标准委员会将TR1的大部分内容融入C++11时,面对的是众所皆知且经
过实践检验的库。在 TR1中,Boost 库占了很大一部分。这包括模板类 tuple和 array、模板 bind 和 fiunction、智能指针(对名称和实现做了一定的修改)、staticassert、regex库和random库。另外,Boost社区和 TR1用户的经验也导致了实际的语言变更,如异常规范的摒弃和可变参数模板的添加,其中可变参数模板让 tuple 模板类和 function 模板的实现更好了。
使用 Boost18.8.3
虽然在 C++11中,可访问 Boost 开发的众多库,但还有很多其他的 Boost库。例如,Conversion库中的 lexical cast 让您能够在数值和字符串类型之间进行简单地转换,其语法类似于 dynamic cast:将模板参数指定为目标类型。程序清单18.11是一个简单示例。
程序清单 18.11 lexcast.cpp
// lexcast.cpp -- simple cast from float to string
#include <iostream>
#include <string>
#include "boost/lexical_cast.hpp"
int main()
{
using namespace std;
cout << "Enter your weight: ";
float weight;
cin >> weight;
string gain = "A 10% increase raises ";
string wt = boost::lexical_cast<string>(weight);
gain = gain + wt + " to "; // string operator+()
weight = 1.1 * weight;
gain = gain + boost::lexical_cast<string>(weight) + ".";
cout << gain << endl;
return 0;
}
第二次运行的结果凸显了 lexical cast的局限性:它未能很好地控制浮点数的格式。为控制浮点数的格式,需要使用更精致的内核格式化工具,这在第17章讨论过。还可以使用lexicalcast将字符串转换为数值。
显然,Boost提供的功能比这里介绍的要多得多。例如,Any库让您能够在STL容器中存储一系列不同类型的值和对象,方法是将Any模板用作各种值的包装器。Math 库在标准math 库的基础上增加了数学函数。Filesystem 库让您编写的代码可在使用不同文件系统的平台之间移植。有关这个库以及如何将其加入到各种平台的更详细信息,请参阅 Boost网站(www.boost.org)。另外,有些C++编译器(如 Cygwin 编译器)还自带了 Boost库。