Logo
Section 1 / 3

std::any

C++17 允许我们将值放入一个安全的容器中,只有在指定其类型时才能访问该值。欢迎使用 std::any。

导入

std::any

C++17 允许我们将值放入一个安全的容器中,只有在指定其类型时才能访问该值。欢迎使用 std::any。

C++17 新增的数据类型 std::any、std::optional 和 std::variant 均基于 Boost 库。

std::any 是一个类型安全的容器,可存储任意可拷贝构造类型的单个值。创建 std::any 容器的方式有多种:可以使用不同的构造函数,也可以使用工厂函数 std::make_any。通过 any.emplace 可以直接在容器中构造一个值;调用 any.reset 则会销毁容器中的对象。若要判断 any 容器是否包含值,可使用方法 any.has_value。还可以通过 any.type 获取所含对象的 typeid。借助泛型函数 std::any_cast,可以访问容器内的对象;如果指定了错误的类型,则会抛出 std::bad_any_cast 异常。

以下代码片段展示了 std::any 的基本用法:

1#include <any> 2#include <iostream> 3#include <vector> 4 5 6using namespace std; 7struct MyClass{}; 8 9int main(){ 10 std::vector<std::any> anyVec{true, 2017, std::string("test"), 3.14, MyClass()}; 11 std::cout << std::any_cast<bool>(anyVec[0]) << endl; // true 12 int myInt= std::any_cast<int>(anyVec[1]); 13 std::cout << myInt << std::endl << endl; // 2017 14 15 std::cout << anyVec[0].type().name() << endl; // b 16 std::cout << anyVec[1].type().name(); // i 17 18 return 0; 19}

该程序定义了一个 std::vector<std::any> 类型的向量。要获取其中某个元素,必须使用 std::any_cast。如前所述,若使用的类型不正确,将引发 std::bad_any_cast 异常。

ℹ️ typeid 的字符串表示形式
typeid 的字符串表示形式由具体实现决定。例如,若 anyVec[1] 的类型为 int,则表达式 anyVec[1].type().name() 在 GCC C++ 编译器下返回 i,而在 Microsoft Visual C++ 编译器下返回 int。

std::any 可以容纳任意类型的对象,而 std::optional 则表示可能包含也可能不包含值的情况。

时间库

std::optional