C++ 参考手册

位置:首页 > C++ 参考手册 >工具库 > std::tuple

定义于头文件 <tuple>
template< class... Types >
class tuple;
(C++11 起)

类模板 std::tuple 是固定大小的异类值汇集。它是 std::pair 的推广。

(std::is_trivially_destructible_v<Types> && ...)true ,则 tuple 的析构函数是平凡的。

(C++17 起)

模板形参

Types... - tuple 所存储的元素的类型。支持空列表。

成员函数

构造新的 tuple
(公开成员函数)
赋值一个 tuple 的内容给另一个
(公开成员函数)
交换两个 tuple 的内容
(公开成员函数)

非成员函数

创建一个 tuple 对象,其类型根据各实参类型定义
(函数模板)
创建左值引用的 tuple,或将 tuple 解包为独立对象
(函数模板)
创建转发引用tuple
(函数模板)
通过连接任意数量的元组来创建一个tuple
(函数模板)
元组式访问指定的元素
(函数模板)
(C++20 中移除)(C++20 中移除)(C++20 中移除)(C++20 中移除)(C++20 中移除)(C++20)
按字典顺序比较 tuple 中的值
(函数模板)
特化 std::swap 算法
(函数模板)

辅助类

在编译时获得 tuple 的大小
(类模板特化)
获得指定元素的类型
(类模板特化)
特化 std::uses_allocator 类型特征
(类模板特化)
tie 解包 tuple 时用来跳过元素的占位符
(常量)

推导指引(C++17 起)

注解

N4387 (作为对 C++11 的缺陷报告应用)前,函数不能用复制列表初始化返回 tuple

std::tuple<int, int> foo_tuple() 
{
  return {1, -1};  // N4387 前错误
  return std::tuple<int, int>{1, -1};  // 始终有效
  return std::make_tuple(1, -1); // 始终有效
}

示例

#include <tuple>
#include <iostream>
#include <string>
#include <stdexcept>
 
std::tuple<double, char, std::string> get_student(int id)
{
    if (id == 0) return std::make_tuple(3.8, 'A', "Lisa Simpson");
    if (id == 1) return std::make_tuple(2.9, 'C', "Milhouse Van Houten");
    if (id == 2) return std::make_tuple(1.7, 'D', "Ralph Wiggum");
    throw std::invalid_argument("id");
}
 
int main()
{
    auto student0 = get_student(0);
    std::cout << "ID: 0, "
              << "GPA: " << std::get<0>(student0) << ", "
              << "grade: " << std::get<1>(student0) << ", "
              << "name: " << std::get<2>(student0) << '\n';
 
    double gpa1;
    char grade1;
    std::string name1;
    std::tie(gpa1, grade1, name1) = get_student(1);
    std::cout << "ID: 1, "
              << "GPA: " << gpa1 << ", "
              << "grade: " << grade1 << ", "
              << "name: " << name1 << '\n';
 
    // C++17 结构化绑定:
    auto [ gpa2, grade2, name2 ] = get_student(2);
    std::cout << "ID: 2, "
              << "GPA: " << gpa2 << ", "
              << "grade: " << grade2 << ", "
              << "name: " << name2 << '\n';
}

输出:

ID: 0, GPA: 3.8, grade: A, name: Lisa Simpson
ID: 1, GPA: 2.9, grade: C, name: Milhouse Van Houten
ID: 2, GPA: 1.7, grade: D, name: Ralph Wiggum

引用

  • C++17 standard (ISO/IEC 14882:2017):
  • 23.5 Tuples [tuple]
  • C++14 standard (ISO/IEC 14882:2014):
  • 20.4 Tuples [tuple]
  • C++11 standard (ISO/IEC 14882:2011):
  • 20.4 Tuples [tuple]