std::tuple

来自cppreference.com
< cpp‎ | utility
 
 
 
 
在标头 <tuple> 定义
template<class... Types>
class tuple;
(C++11 起)

类模板 std::tuple 是固定大小的异质值的汇集。它是 std::pair 的泛化。

如果 std::is_trivially_destructible<Ti>::valueTypes 中的每个 Ti 都是 true,那么 std::tuple 的析构函数平凡。

如果程序声明了 std::tuple显式部分特化,那么程序非良构,不要求诊断。

目录

[编辑]模板形参

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

[编辑]成员函数

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

[编辑]非成员函数

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

[编辑]辅助概念

指定类型实现了元组协议
std::getstd::tuple_elementstd::tuple_size
(仅用于阐述的概念*)[编辑]

[编辑]辅助类

获得 tuple 的大小
(类模板特化)[编辑]
获得指定元素的类型
(类模板特化)[编辑]
特化 std::uses_allocator 类型特征
(类模板特化)[编辑]
确定 tupletuple-like 类型的公共引用类型
(类模板特化)[编辑]
确定 tupletuple-like 类型的公共类型
(类模板特化)[编辑]
tuple 的格式化支持
(类模板特化)[编辑]
(C++11)
tie 解包 tuple 时用来跳过元素的占位符
(常量)[编辑]

[编辑]辅助特化

template<class... Ts>

constexprbool enable_nonlocking_formatter_optimization<std::tuple<Ts...>>

 =(enable_nonlocking_formatter_optimization<Ts>&& ...);
(C++23 起)

这个 std::enable_nonlocking_formatter_optimization 针对每个元素类型都已启用的 tuple 对象的打印启用 std::printstd::println 的高效实现。

[编辑]推导指引(C++17 起)

[编辑]注解

由于元组的“形状”(其大小、各元素类型和这些类型的次序)是其类型签名的一部分,所以它们必须全部在编译时可用且仅对其他编译时信息有依赖。这意味着许多元组上的条件性运算(尤其是有条件的前附/后附和过滤)只有在其条件可以运行时求值时才可能进行。例如,给定 std::tuple<int, double, int>,对类型进行过滤是可能的——比如返回 std::tuple<int, int>——但不可能基于各个元素是否为正来过滤(这会造成其具有取决于元组的运行时值的不同类型签名),除非其所有元素自身也都是 constexpr

作为变通可以使用 std::optional 的元组,但仍然不可能基于运行时信息调整其大小。

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

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

[编辑]示例

#include <iostream>#include <stdexcept>#include <string>#include <tuple>   std::tuple<double, char, std::string> get_student(int id){switch(id){case0:return{3.8, 'A', "Lisa Simpson"};case1:return{2.9, 'C', "Milhouse Van Houten"};case2:return{1.7, 'D', "Ralph Wiggum"};case3:return{0.6, 'F', "Bart Simpson"};}   throwstd::invalid_argument("id");}   int main(){constauto student0 = get_student(0);std::cout<<"ID:0,"<<"GPA:"<<std::get<0>(student0)<<","<<"等级:"<<std::get<1>(student0)<<","<<"姓名:"<<std::get<2>(student0)<<'\n';   constauto student1 = get_student(1);std::cout<<"ID:1,"<<"GPA:"<<std::get<double>(student1)<<","<<"等级:"<<std::get<char>(student1)<<","<<"姓名:"<<std::get<std::string>(student1)<<'\n';   double gpa2;char grade2;std::string name2;std::tie(gpa2, grade2, name2)= get_student(2);std::cout<<"ID:2,"<<"GPA:"<< gpa2 <<","<<"等级:"<< grade2 <<","<<"姓名:"<< name2 <<'\n';   // C++17 结构化绑定:constauto[gpa3, grade3, name3]= get_student(3);std::cout<<"ID:3,"<<"GPA:"<< gpa3 <<","<<"等级:"<< grade3 <<","<<"姓名:"<< name3 <<'\n';}

输出:

ID:0,GPA:3.8,等级:A,姓名:Lisa Simpson ID:1,GPA:2.9,等级:C,姓名:Milhouse Van Houten ID:2,GPA:1.7,等级:D,姓名:Ralph Wiggum ID:3,GPA:0.6,等级:F,姓名:Bart Simpson

[编辑]缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告 应用于 出版时的行为 正确行为
LWG 2796 C++11 std::tuple 的析构函数的平凡性未指明 已指明
LWG 3990 C++11 程序可以声明 std::tuple 的显式或部分特化 此时程序非良构(不要求诊断)

[编辑]引用

  • C++23 标准(ISO/IEC 14882:2024):
  • 22.4 Tuples [tuple]
  • C++20 标准(ISO/IEC 14882:2020):
  • 20.5 Tuples [tuple]
  • C++17 标准(ISO/IEC 14882:2017):
  • 23.5 Tuples [tuple]
  • C++14 标准(ISO/IEC 14882:2014):
  • 20.4 Tuples [tuple]
  • C++11 标准(ISO/IEC 14882:2011):
  • 20.4 Tuples [tuple]

[编辑]参阅

实现二元组,即一对值
(类模板)[编辑]
close