C++学习笔记(43):std::variant

0 阅读1分钟

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专门用来:一个变量,二选一 / 多选一 存不同类型。

操作一:赋值操作

image.png

操作二:判断现在里面是什么类型

image.png

操作三:安全取值

image.png

操作四:暴力取值

image.png

什么时候你应该用 variant?

  1. 一个变量可能是数字,也可能是文本(比如配置、json 值)
  2. 函数返回值:成功返回数字,失败返回错误字符串
  3. 不同类型的消息、数据包,统一放一个容器
  4. 不想写继承、虚函数,又需要 “多种类型统一管理”