std::any 能存储任意可复制构造的类型,如 int、string 等,通过 std::any_cast 安全访问,避免 void* 类型转换风险,适用于需动态保存不同类型数据的场景。
在C++17中,std::any 是一个类型安全的容器,能够存储任意类型的值。它属于 头文件 的一部分,为需要动态保存不同类型数据的场景提供了一种轻量且安全的解决方案。
std::any 可以持有任意可复制构造(CopyConstructible)的类型。比如 int、double、string、自定义类等都可以存进去。与 void* 不同,std::any 保留了类型信息,避免了手动类型转换带来的安全隐患。
常见使用场景包括:
下面是一个简单的例子展示如何使用 std::any:
#include #include#include int main() { std::any value = 42; // 存入 int std::cout << std::any_cast
(value) << '\n'; value = std::string{"Hello"}; // 替换为 string std::cout zuojiankuohaophpcnzuojiankuohaophpcn std::any_castzuojiankuohaophpcnstd::stringyoujiankuohaophpcn(value) zuojiankuohaophpcnzuojiankuohaophpcn '\n'; if (value.type() == typeid(std::string)) { std::cout zuojiankuohaophpcnzuojiankuohaophpcn "当前是字符串类型\n"; } try { auto num = std::any_cast
(value); // 类型错误 } catch (const std::bad_any_cast&) { std::cout zuojiankuohaophpcnzuojiankuohaophpcn "类型转换失败\n"; } return 0; }
使用 std::any 时有几个核心点需要注意:
还可以通过指针形式进行 cast 来避免异常:
if (auto p = std::any_cast(&value)) { std::cout << "值为: " << *p << '\n'; }
基本上就这些。std::any 提供了类型安全的泛型存储能力,虽然性能上不如具体类型高效,但在需要灵活性的地方非常实用。注意合理使用,避免滥用导致类型失控。