如果 std::any 中存储的值的类型与目标类型不匹配,则会抛出 std::bad_any_cast 异常。
要访问包含的值,可以通过std::any_cast<对象类型>的方式: auto s = std::any_cast<std::string>(a); 如果转换失败,因为对象为空或包含的类型不匹配,则抛出std::bad_any_cast。因此,在不检查或不知道类型的情况下,最好实现以下功能: try { auto s = std::any_cast<std::string>(a); ... } catc...
std::any_cast 不需要原始对象的类型 是否可以std::any_cast在不放入第一个模板参数(所覆盖的对象的类型any)的情况下使用?我尝试使用any_cast<decltype(typeid(toCast).name())>但没有成功。 还尝试从一开始就存储对象类型,但这也不起作用,因为变量无法存储类型。 5 C++ 的基本原则之一是所有对象的类型在编译...
一个简单的样例如下: #include<iostream>#include<any>#include<typeinfo>intmain(){std::anyvar=3.33;if(var.type()==typeid(int)){std::cout<<"int"<<std::endl;std::cout<<std::any_cast<int>(var)<<std::endl;}elseif(var.type()==typeid(double)){std::cout<<"double"<<std::endl;std...
2. std::any 可以存任意可拷贝类型变量的容器 C++17使用了std::any来替代C语言中的void*,std::any有以下优点 存储类型信息,更安全。std::any_cast是一种安全的类型转换。 像STL容器一样,析构时会自动析构容器内的对象。 用法如下所示:
在C++语言中:析构函数名应与类名相同,只是在函数名前面加一个位取反符 ~ ,例如 ~ stud( ),以...
std::any更安全:在类型T被转换成void*时,T的类型信息就已经丢失了,在转换回具体类型时程序无法判断当前的void*的类型是否真的是T,容易带来安全隐患。而std::any会存储类型信息,std::any_cast是一个安全的类型转换。 std::any管理了对象的生命周期,在std::any析构时,会将存储的对象析构,而void*则需要手动管...
std::any_cast(&a): 强制转换得到容器中的值的地址 2.std::any操作 2.1 构造函数 默认情况下,std::any的初始值为空。 std::any a1; // a1 is empty 如果传递一个值进行初始化,则将其衰减类型用作所包含值的类型: std::any a2 =42;// a2 contains value of type int ...
以下是使用std::any的示例代码: #include <iostream> #include <any> #include <string> #include <vector> int main() { std::any a = 1; // 存储一个整数 std::cout << std::any_cast<int>(a) << '\n'; // 输出 1 a = 3.14; // 存储一个浮点数std::cout << std::any_cast<double...
bad_any_cast (C++17) 当类型不匹配时由按值返回形式的any_cast所抛出的异常 (类) 注解 功能特性测试宏值标准功能特性 __cpp_lib_any201606L(C++17)std::any 示例 运行此代码 #include <any>#include <iostream>intmain(){std::cout<<std::boolalpha;// any 类型std::anya=1;std::cout<<a.type(...