推荐答案
// www.javascriptcn.com code example
#include <any>
#include <iostream>
#include <string>
int main() {
std::any data;
// 存储一个整数
data = 42;
std::cout << "Stored int: " << std::any_cast<int>(data) << std::endl;
// 存储一个字符串
data = std::string("Hello, World!");
std::cout << "Stored string: " << std::any_cast<std::string>(data) << std::endl;
// 检查类型
if (data.type() == typeid(std::string)) {
std::cout << "Data is a string." << std::endl;
}
// 重置 any 对象
data.reset();
if (!data.has_value()) {
std::cout << "Data is empty." << std::endl;
}
return 0;
}本题详细解读
std::any 概述
std::any 是 C++17 引入的一个类型安全的容器,可以存储任意类型的值。它类似于 void*,但提供了类型安全性。std::any 可以存储任何可复制的类型,并且在运行时可以检查存储的类型。
主要成员函数
std::any::any(): 默认构造函数,创建一个空的std::any对象。std::any::any(const T& value): 构造函数,存储一个给定类型的值。std::any::operator=(const T& value): 赋值操作符,用于存储或替换std::any中的值。std::any_cast<T>(std::any& any): 将std::any中的值转换为类型T。如果类型不匹配,抛出std::bad_any_cast异常。std::any::type(): 返回存储值的类型信息,类型为std::type_info。std::any::has_value(): 检查std::any是否包含值。std::any::reset(): 清空std::any对象,使其不再包含任何值。
使用场景
std::any 适用于需要在运行时动态存储和检索不同类型值的场景。例如,在实现插件系统、配置管理或动态类型系统时,std::any 可以简化代码并提高类型安全性。
注意事项
- 使用
std::any_cast时,必须确保类型匹配,否则会抛出异常。 std::any存储的值必须是可复制的。std::any不适用于存储引用类型。
通过 std::any,C++ 程序员可以在不牺牲类型安全性的情况下,灵活地处理多种类型的数据。