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 framework 中的 utils::AnyMovable 类)是基于第二类别的变体值类型。它支持安全、受检查的提取值,严格根据其类型进行检查,并传递值的拥有权。可以认为 boost::anys::unique_anyboost::any(或 std::any)的一种替代方案,它不需要被包含的类型进行拷贝或移动构造。


PrevUpHomeNext