std::any支持运行时任意单类型存储与动态类型检查,std::variant限定编译时预定义的多类型集合并提供静态类型安全和visit模式匹配。

std::any 和 std::variant 都是 C++17 引入的类型安全的“泛型容器”,但设计目标和使用场景完全不同:前者支持运行时任意类型(单类型、动态确定),后者限定编译时已知的有限类型集合(多类型、静态枚举)。
std::any 是“一个能装任何类型的盒子”,只要满足可复制构造,就能存;类型信息在运行时通过 typeid 保存和检查。它不关心你打算存什么,只保证“存得进、取得出、类型对”。
std::variant 是“一组预定义类型的联合体”,比如 variant
std::any 的类型检查完全在运行时:
- 存入:any a = 42; // OK
- 取出:int x = any_cast
- 错误取用:any_cast
- 可用 a.type() 获取 type_info,但无法自动 dispatch
std::variant 的类型安全由编译器保障:
- 存入:variant
- 取出必须显式处理所有可能情况(否则编译失败):
visit([](auto&& x) { cout
get
- 编译期强制穷尽匹配,避免漏处理分支
std::any 内部通常采用小对象优化(SOO)+ 堆分配:小类型(如 int)直接存栈上,大类型(如 vector)堆分配并管理生命周期。有额外虚函数/函数指针开销,且每次取值需运行时类型比对。
std::variant 是纯栈结构,大小为最大成员尺寸 + 少量 tag 字节(通常 1 字节)。无动态分配、无虚调用,visit 分支通常被编译器内联优化,性能接近手写 union + switch。
用 std::any 当你需要:
- 插件系统中传递用户自定义数据(类型不可预知)
- 实现弱类型脚本桥接(如暴露 C++ 值给 Lua)
- 临时绕过模板限制,且类型仅在运行时决定
用 std::variant 当你需要:
- 表达“非此即彼”的业务状态(如 result
- 替代裸 union 或 void*,获得类型安全和自动析构
- 性能敏感路径中实现多态行为(配合 visit + constexpr lambda)
- 编译期可验证的类型契约(IDE 可提示缺失分支)
以上就是c++++的std::any和std::variant有什么区别 动态类型容器【详解】的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号