Boost开发指南-4.13小结

noncopyable,它为定义一个不允许拷贝的类提供了简单而清晰的解决方法,可以节省很多代码和时间。应当总用boost::noncopyable的名字空间域限定形式来使用它,而不是用using语句,避免在头文件打开boost名字空间。

ignore_unused是一个很小的工具,它可以消除一些暂时未使用的变量或者类型定义所产生的警告,命名清晰,有利于代码后续的维护工作。

optional库使用容器语义为“无效值”提供了一个很好的解决方案。它类似容器与智能指针的混合体,可以容纳任意类型的元素,同时又提供operator*和 operator->重载,可以像指针一样访问元素。在使用optional存储的元素之前,必须测试它的有效性。

assign库演示了重载逗号、括号操作符的“神奇”用法,比c++11的初始化列表功能更强大。利用c++的“语法糖”特性,我们可以写出近乎不可思议的代码,轻松完成原本要一大堆代码才能完成的初始化或者赋值任务,在构建原型或者测试程序时非常有用。assign库对标准容器、容器适配器和Boost容器都提供了很全面的支持,这使得它具有很高的使用价值。

变量值的交换是一个看似简单实则复杂的操作,它被用来处理异常安全性和类的自我赋值,如果想要自己的类安全高效,那么应该提供一个好的swap函数,它是很多实用功能的基础,Boost 库中几乎所有的类都有swap()成员函数就清楚地说明了这一点。boost::swap 是对std::swap 的泛化,可以通过各种方式找到最佳的对象交换方法,而std::swap只能提供最通用的交换。如果你自己的类实现了高效的交换方法,那么boost::swap就会自动调用它。

单件是一个很重要的设计模式,它让类在整个程序生命周期中只能有一个实例。Boost库提供了serialization.singleton 实现了单件模式,它要求模板类型参数T具有缺省构造函数,而且构造和析构时不能抛出异常,通常情况下这两个要求都很容易满足。singleton不仅支持模板参数方式,还支持继承方式,可以返回mutable或const实例。

tribool 实现了三态布尔逻辑,如同语言内置的bool类型一样简单好用,只需要稍微学习一下它的运算规则就能够完全掌握,我们还讨论了它与optional<bool>的细微区别。

操作符重载简化了代码的编写,提供了清晰易懂的语法,但实现操作符重载是件烦琐的工作。operators库提供了很多定义良好的模板类,可以极大地简化操作符重载的实现工作。程序员只需要用基类链技术继承它们,再实现少量必需的操作符,就能够轻松获得其他操作符的功能。

operators库很强大易用,但保证操作符具有正确的语义还是程序员自己的责任,操作符的重载应该与它原来的含义基本一致——至少不能违背大多数人的常识。equality_comparable、less_than_comparable和totally_ordered是最常用的操作符重载类,它们提供比较运算,被用于支持标准容器。其他的操作符应当慎重使用,只有当类具有明显的运算语义,操作符重载能够极大简化语法时才应该使用。读者可以参考assign库、exception库、format库和rational库,它们对操作符的重载恰到好处,保持了清晰自然的语义又没有给用户带来过多的语法学习困难。

exception库是对c++标准的异常体系的补充和完善,它可以在异常对象中存储任意数量任意类型的数据,有助于增强异常的表达能力。boost::exception被特意设计为不从std::exception派生,这使得它可以很好地配合已有代码工作,但我们最好是用虚继承的方式来使用它。exception库还有一系列的辅助函数、类和宏,帮助我们更好地处理异常相关的问题。

uuid组件实现了对UUID的表示和处理,提供了基于名字和随机数的生成算法生成全球唯一的标识符,可以用在很多地方来唯一地标识对象。uuid库里还附带了一个SHAl算法的实现,能够为任意长度的数据生成SHA1摘要。

config和utility_库,它们提供了几个很有用的宏:BOOST_STRINGIZE实现编译期字符串转换;BOOST_STATIC_CONSTANT可以定义类的静态整型成员常量;BOOST_BINARY使得二进制数字的书写很便利;BOOST_CURRENT_FUNCTION能够输出函数名称字符串,它被exception库所使用。

猜你喜欢

转载自blog.csdn.net/qq_36314864/article/details/132557929