应选 std::variant,因其类型集合已知且有限;std::any 仅适用于运行时类型完全动态、无法预设范围的场景,二者核心区别在于编译期类型安全与运行时类型擦除。

选 std::variant 还是 std::any,关键看“类型集合是否已知且有限”——如果能提前列出所有可能类型,用 std::variant;如果类型完全动态、运行时才确定,且无法预设范围,才考虑 std::any。
std::variant 是类型安全的“多选一”容器,编译期就限定好可存放的类型列表,比如 std::variant<int std::string double></int>。它不接受其他类型,尝试赋值会编译失败,杜绝了运行时类型错误。
std::visit 或 std::get<t></t>(需确保当前持有类型匹配,否则抛 std::bad_variant_access)std::visit 写出清晰、无虚函数开销的多态逻辑std::any 能装任意可复制类型,不限定类型集合,但代价是:类型信息仅在运行时保存,访问前必须用 std::any_cast 显式断言类型,失败则抛 std::bad_any_cast。它本质是类型擦除,底层常触发堆分配。
std::any 是否“逻辑相等”,需先 cast 出具体类型std::visit 那样的统一访问机制,每个取值点都要重复类型检查有人觉得 “std::any 更灵活”,结果把本该静态可知的类型(如状态码 + 错误消息 + 重试次数)全塞进 std::any,导致代码散落大量 if (auto p = std::any_cast<int>(&x)) { ... }</int>,既难读又易漏处理分支。
立即学习“C++免费学习笔记(深入)”;
std::variant 是更安全、高效、可维护的选择std::any 不是“万能兜底”,而是“最后手段”。滥用它等于放弃编译器对类型的把关std::variant 访问快、无动态内存、调试器能直接看到当前持有的类型和值;std::any 每次访问都有类型检查开销,对象存储在堆上(小对象优化不一定启用),调试时只能看到 std::any 对象本身,看不到内部类型名和内容,除非手动 cast。
std::variant
std::any 可接受基本上就这些。类型边界清晰,选 variant;边界彻底消失,再拿 any 救火。
以上就是C++中的std::variant和std::any如何选择?C++类型安全容器对比【C++17】的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号