Boost C++ 库

...是世界上最受尊敬、设计最精巧的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu, C++ Coding Standards

第 4 章. Boost.Any 1.2 - Boost C++ 函数库
PrevUpHomeNext

第 4 章. Boost.Any 1.2

根据 Boost 软件许可证版本 1.0 发布。(参见随附文件 LICENSE_1_0.txt 或在 https://boost.ac.cn/LICENSE_1_0.txt 复制)

有时我们需要一种通用(这里指“泛用”而非“基于模板的编程”)的类型:真正可变的变量,可以容纳许多其他更具体类型的值,而不是 C++ 正常的严格静态类型。我们可以区分三种基本的通用类型:

  • 可转换类型,可以保存多种可能的值类型之一,例如 intstring,并能在它们之间自由转换,例如将 5 解释为 "5" 或反之。这类类型在脚本和其他解释型语言中很常见。boost::lexical_cast 支持此类转换功能。
  • 判别式类型,包含不同类型的值但不尝试进行转换,即 5 被严格地保存为 int,并且不能隐式转换为 "5"5.0。它们对解释不敏感但对类型敏感,这有效地使它们成为安全的、泛用的单值容器,没有因模糊转换而产生意外的余地。
  • 不区分类型,可以指向任何内容但对实际底层类型一无所知,将所有形式的访问和解释都委托给程序员。这种空白被 void * 所主导,它为意外的、未定义的行为提供了充足的空间。

boost::any 类(基于 Kevlin Henney 在 C++ Report 2000 年 7/8 月刊第 12 卷第 7 期发表的 Valued Conversions 中描述的同名类)是基于第二类的一个变体值类型。它支持复制任何值类型,并能安全地、经过检查地、严格根据其类型提取该值。一个类似的设计,提供了更合适的运算符,可用于通用的函数适配器 any_function、通用的迭代器适配器 any_iterator 以及其他需要统一运行时处理但仅支持编译时模板参数兼容性的对象类型。

boost::anys::unique_any 类(基于 🐙 userver 框架 中的 utils::AnyMovable 类)是基于第二类的一个变体值类型。它支持安全地、经过检查地、严格根据其类型提取该值,并传递该值的所有权。可以将 boost::anys::unique_any 视为 boost::any(或 std::any)的一种替代方案,它不需要被持有的类型支持复制或移动构造。


PrevUpHomeNext