std::tuple是C++11引入的固定大小异构集合,支持编译期索引访问、结构化绑定和类型安全解包;可用make_tuple自动推导类型或显式模板构造,通过std::get按编译期常量索引访问,C++17起推荐使用auto[x,y,z]=t解包,并提供tuple_size_v和tuple_element_t等元编程工具。
std::tuple 是 C++11 引入的标准库工具,用来打包任意数量、任意类型(包括相同或不同)的值,形成一个固定大小的异构集合。它不提供运行时索引访问(如 tuple[i]),但支持编译期索引、结构化绑定和类型安全的解包。
用 std::make_tuple 最方便,编译器自动推导每个元素类型;也可显式指定模板参数构造:
auto t1 = std::make_tuple(42, "hello", 3.14); → 类型为 tuple
std::tuple<:string bool long> t2{"world", true, 100L}; → 显式类型 + 直接初始化std::tuple t3{1, 2}; → 同类型也完全合法用 std::get(t) 获取第 I 个元素(I 必须是编译期常量,如字面量或 constexpr 变量
):
int a = std::get(t1); → 得到 42std::get(t1) = 2.718; → 修改第三个元素(前提是 tuple 非 const)std::get(t1) = "hi"; → 注意:原字符串字面量不可改,但这里改的是指针值,不是内存内容越界访问(如 std::get(t1))是编译错误,类型不匹配(如 std::get(t1) 当作 double 用)也是编译错误,保证类型安全。
用 auto [a, b, c] = t1; 一行完成声明+解包,变量名、顺序、类型全部自动推导:
auto [x, s, pi] = t1; → x 是 int,s 是 const char*,pi 是 doubleconst auto& [u, v] = t2; 避免拷贝auto [val, _, _] = t1;(C++17 允许未命名绑定)编译期元编程常用:
constexpr size_t N = std::tuple_size_v; → 值为 3using T0 = std::tuple_element_t; → 即 int
static_assert(std::is_same_v); → 编译期校验类型这些在泛型函数、模板特化或实现 tuple 遍历时特别有用,比如写一个通用的打印函数,通过递归或折叠表达式遍历每个元素。
不复杂但容易忽略:tuple 是值语义,拷贝开销取决于内部类型的拷贝成本;若含大对象,建议用引用包装(std::ref(x))或 move 构造避免冗余复制。