std::tuple是c++11引入的编译期类型安全、零开销异构元组;支持make_tuple构造、get或结构化绑定访问、tuple_size_v和tuple_element_t获取元信息,常用于多返回值、map键、模板元编程等场景。

std::tuple 是 C++11 引入的轻量级固定大小异构容器,用来打包多个类型不同的值,类似 python 的元组,但编译期类型安全、零运行时开销。
创建 tuple:用 make_tuple 或直接构造
推荐用 std::make_tuple,它自动推导类型,写法简洁:
也可以显式指定类型并构造:
std::tuple<int, double, std::string> t2(100, 2.718, "world");
注意:空 tuple 也合法:std::tuple t3;
立即学习“C++免费学习笔记(深入)”;
访问元素:用 get(t) 或结构化绑定(C++17 起)
传统方式是通过 std::get(tuple) 获取,索引从 0 开始,编译期检查:
-
int a = std::get(t1);// 得到 42 -
double b = std::get(t1);// 得到 3.14 -
std::string s = std::get(t1);// 得到 “hello”
C++17 支持更直观的 结构化绑定:
auto [x, y, z] = t1; // x:int, y:double, z:string —— 类型自动推导,顺序严格对应
绑定变量名可任意,但数量和顺序必须匹配 tuple 元素个数。
获取大小与类型信息
tuple 的长度在编译期确定,用 std::tuple_size_vstd::tuple_size<t>::value</t>:
static_assert(std::tuple_size_v<decltype(t1)> == 3);
获取某位置元素的类型,用 std::tuple_element_t:
static_assert(std::is_same_v<std::tuple_element_t<1, decltype(t1)>, double>);
常见实用场景
- 函数多返回值:替代结构体或输出参数,例如
return std::make_tuple(result, status, count); - 作为 map 的 key:支持字典序比较,如
std::map<:tuple std::string>, double> m;</:tuple> - 模板元编程辅助:配合
std::apply拆包调用可变参数函数 - 临时聚合数据:比写 Struct 更快,尤其在 Lambda 或算法内部短生命周期使用
基本上就这些。tuple 不复杂但容易忽略细节——类型严格、索引编译期检查、不可动态增删,用对了很干净利落。