C++17 异构(tuple)与多模态数据结构(variant)
C++17 提供了多种用于存储和处理不同类型数据的结构。
其中,std::variant 和 std::tuple 是最常用的两种异构容器,各有适用场景。
1️⃣ std::variant
概念
- 类型安全的联合体,一次只能存储 一种类型。
- 适用于多模态数据、事件系统、消息队列等场景。
- 模板参数可以有任意多个 不同类型(类型不能重复)。
示例
#include <variant>
#include <string>
#include <iostream>using MultiType = std::variant<int, double, std::string>;int main() {MultiType v;v = 42; // intv = 3.14; // doublev = "hello"s; // string
}
访问方式
std::get<T>/std::get<index>→ 获取指定类型或索引的值std::get_if<T>→ 返回指针,类型不匹配返回 nullptrstd::visit→ 根据当前存储类型执行逻辑(推荐)
2️⃣ std::tuple
概念
- 异构类型容器(heterogeneous container)。
- 一次可以存储 多个不同类型元素,每个元素类型固定。
- 适合固定结构数据、函数多返回值、记录多字段信息。
示例
#include <tuple>
#include <string>
#include <iostream>int main() {std::tuple<int, double, std::string> t{42, 3.14, "hello"};std::cout << std::get<0>(t) << "\n"; // 42std::cout << std::get<1>(t) << "\n"; // 3.14std::cout << std::get<2>(t) << "\n"; // hello// 使用结构化绑定auto [i, d, s] = t;
}
特点
- 每个元素同时存在,类型在编译期确定
- 是典型的 异构/异形容器
3️⃣ std::variant 与 std::tuple 对比
| 维度 | std::variant | std::tuple |
|---|---|---|
| 存储数量 | 单值,类型可变 | 多值组合,类型固定 |
| 类型变化 | 运行时可切换 | 编译期固定 |
| 用途 | 多模态单值、事件系统 | 多返回值、固定结构数据 |
| 访问方式 | std::get / std::visit | std::get / 结构化绑定 |
一句话理解:
- variant = 单位置,多模态单值
- tuple = 多位置,固定结构组合
