C++中std::variant怎么实现多态存储_C++无继承实现类型安全容器【设计】-C++

std::variant 是类型安全的编译期确定联合体,不是多态机制;它在运行时仅存一种已知类型,通过 index() 或 holds_alternative() 跟踪活跃类型,适用于 JSON 解析等有限类型场景。

std::variant 是什么,不是什么

std::variant 不是多态机制,它不依赖虚函数表,也不要求类型间有继承关系。它本质是一个**类型安全的联合体(union)**,在编译期确定所有可能类型,运行时仅存其中一种,并用内部索引(index())或类型标签(holds_alternative())跟踪当前活跃类型。

它解决的问题很具体:需要一个变量能“在几个已知类型中选一个”并保证访问安全,比如解析 JSON 时字段可能是 int、double 或 std::string,但绝不会是用户自定义未声明的类型。

怎么正确构造和访问 variant

构造时必须明确初始化为某一个可选项,不能留空(除非含 std::monostate);访问必须通过 std::visit 或 std::get,且后者在类型不匹配时抛 std::bad_variant_access 异常。

  • 推荐用 std::visit + lambda 处理所有分支,避免手动检查 index() 或重复调用 holds_alternative
  • std::get(v) 仅在 100% 确认当前是 T 时使用(例如刚用 holds_alternative(v) 检查过)
  • 若需默认行为,把 std::monostate 放在 variant 列表首位,它代表“空状态”,可被默认构造
std::variant v = 42;
std::visit([](auto&& x) {
    using T = std::decay_t;
    if constexpr (std::is_same_v) {
        std::cout << "int: " << x;
    } else if constexpr (std::is_same_v) {
        std::cout << "double: " << x;
    } else {
        std::cout << "string: " << x;
    }
}, v);

为什么不能替代继承多态,以及它的代价在哪

std::variant 的类型集合在编译期固定,无法动态扩展;而继承多态靠运行时绑定,支持新子类无需修改已有容器逻辑。这是根本设计分歧,不是“哪个更好”,而是“是否适用”。

立即学习“C++免费学习笔记(深入)”;

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » C++中std::variant怎么实现多态存储_C++无继承实现类型安全容器【设计】-C++
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1391+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 3993945+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1391+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 3993945+
  • 本周更新: 0+
  • 最后更新: 2026-03-16