C++17引入的std::variant是一种类型安全的联合体,它解决了传统union无法存储非平凡类型以及易引发未定义行为的问题。掌握variant的核心用法和安全访问技巧,能显著提升代码的健壮性和可读性。
variant怎么用
std::variant允许你在同一内存位置存储多种类型中的一种,使用时需要包含std::variant<int, double, std::string> v;,此时v默认初始化为第一个类型(int)的零值。你可以直接赋值任何候选类型,variant会自动记录当前激活的类型。
variant和union区别
传统union无法包含带有构造函数或析构函数的类型,比如std::string,而variant完全支持。更重要的是,variant会记住当前存储的是哪种类型,通过index()函数可以查询,而union需要程序员手动维护类型标记。使用union容易因类型误读导致崩溃,variant则将类型安全检查交由编译器处理。

访问variant值方法
直接通过std::getstd::visit({ std::cout << arg; }, v);可以统一打印任意类型,无需手动判断分支。
variant异常处理技巧
当使用std::get时务必捕获异常,或者先调用index()判断当前类型。另一种常见陷阱是重复类型,声明如std::variant<int, int>会导致编译错误,因为无法区分。此外,从variant中取出string后若忘记检查类型,可能访问到其他类型的数据,建议总是配合std::holds_alternative进行前置判断。
你在实际项目中使用std::variant时遇到过哪些难以排查的bug?欢迎在评论区分享你的踩坑经历,点个赞让更多开发者看到这份避坑指南!
