std::any是C++17提供的类型安全泛型容器,可存储任意类型值,需通过std::any_cast安全提取,支持自定义类型、类型检查与清空操作,适用于配置管理等灵活数据场景。

在C++17中,std::any 是一个可以存储任意类型值的类型安全容器。它属于 头文件,常用于需要动态保存不同类型数据的场景,比如配置项、参数传递、插件系统等。
基本用法
使用 std::any 可以直接赋值各种类型:
创建 any 对象并赋值 int、string、自定义类等通过 std::any_cast 提取原始类型检查是否包含有效值(非空)
// 示例代码
#include #include #includeint main() {std::any data;
// 存储整数data = 42;std::cout << "int: " << std::any_cast(data) << 'n';// 存储字符串data = std::string("Hello World");std::cout << "string: " << std::any_cast(data) << 'n';// 存储浮点数data = 3.14;std::cout << "double: " << std::any_cast(data) << 'n';return 0;
}
立即学习“C++免费学习笔记(深入)”;
类型安全提取:any_cast 的使用
从 std::any 中取值必须使用正确的类型,否则会抛出 std::bad_any_cast 异常。
使用 std::any_cast(any_obj) 进行强制转换可用指针形式判断是否存在某类型:std::any_cast(&any_obj)
// 安全访问示例
if (data.type() == typeid(int)) { std::cout << "It's an int: " << std::any_cast(data) << 'n';} else { std::cout << "Not an intn";}// 指针方式检查和访问(更安全)double dptr = std::any_cast(&data);if (dptr) {std::cout << "Got double via pointer: " << dptr << 'n';} else {std::cout << "Not a doublen";}
存储自定义类型
std::any 也支持用户自定义类或结构体:
struct Person { std::string name; int age; Person(std::string n, int a) : name(n), age(a) {}};// 使用std::any p = Person("Alice", 25);Person person = std::any_cast(p);std::cout << person.name << ", " << person.age << 'n';
清空与状态检查
可以通过赋值为 {} 来清空 any:
data.reset() 或 data = std::any(); 清除内容data.has_value() 判断是否含有值data.type() 返回当前存储类型的 typeid
data.reset();if (!data.has_value()) { std::cout << "No value stored.n";}
基本上就这些。std::any 提供了类型安全的泛型存储能力,比 void* 更安全易用,适合小范围灵活数据处理。注意避免频繁使用,因有轻微运行时开销。
以上就是c++++中的std::any怎么用_c++任意类型存储any用法示例的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1480714.html
微信扫一扫
支付宝扫一扫