std::variant 是啥
你可以把它视作一个盒子,里面只能装各种类型中的一个。 盒子可以装A类型、B类型、C类型,但一次只能装一个,装新的会把旧的拿出来自动扔掉。
- 同一时间,盒子里只会有一个东西
- 放新东西,旧东西自动丢掉、清理干净
- 你拿错东西,它直接报错,防止你乱搞
举例
// 这个盒子:只能装 int 整数 或者 string 字符串
variant<int, string> box;
再举例
variant<int, string> box;
box = 666; // 现在盒子里是 整数
box = "你好"; // 整数自动销毁,现在盒子里是 字符串
它是用来解决什么问题的?
痛点1:
我想一个变量,有时候存数字,有时候存字符串。普通变量做不到,你只能:
- 要么定义两个变量浪费空间
- 要么用 C 语言的 union(容易崩、内存乱套、字符串不能用)
痛点2: 多态要用基类 + 虚函数,代码重、慢、麻烦。
所以 C++17 出了 variant专门用来:一个变量,二选一 / 多选一 存不同类型。
操作一:赋值操作
操作二:判断现在里面是什么类型
操作三:安全取值
操作四:暴力取值
什么时候你应该用 variant?
- 一个变量可能是数字,也可能是文本(比如配置、json 值)
- 函数返回值:成功返回数字,失败返回错误字符串
- 不同类型的消息、数据包,统一放一个容器
- 不想写继承、虚函数,又需要 “多种类型统一管理”