std::tuple

< cpp‎ | utility
 
 
工具库
通用工具
日期和时间
函数对象
格式化库 (C++20)
(C++11)
关系运算符 (C++20 中弃用)
整数比较函数
(C++20)
swap 与类型运算
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
常用词汇类型
tuple
(C++11)
(C++17)
(C++17)
(C++17)
(C++17)

初等字符串转换
(C++17)
(C++17)
 
 
定义于头文件 <tuple>
template< class... Types >
class tuple;
(C++11 起)

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

std::is_trivially_destructible<Ti>::valueTypes 中的每个 Titrue ,则 tuple 的析构函数为平凡。

模板形参

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++ 标准。

DR 应用于 出版时的行为 正确行为
LWG 2796 C++11 tuple 的析构函数的平凡性未指明 已指明

引用

  • C++20 standard (ISO/IEC 14882:2020):
  • 20.5 Tuples [tuple]
  • 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]