Namespaces
Variants

std:: tuple

From cppreference.net
Utilities library
Definido en el encabezado <tuple>
template < class ... Types >
class tuple ;
(desde C++11)

La plantilla de clase std::tuple es una colección de tamaño fijo de valores heterogéneos. Es una generalización de std::pair .

Si std:: is_trivially_destructible < Ti > :: value es true para cada Ti en Types , el destructor de std::tuple es trivial.

Si un programa declara una especialización explícita o parcial de std::tuple , el programa está mal formado, no se requiere diagnóstico.

Contenidos

Parámetros de plantilla

Tipos... - los tipos de los elementos que almacena la tupla. Se admite lista vacía.

Funciones miembro

construye un nuevo tuple
(función miembro pública)
asigna el contenido de un tuple a otro
(función miembro pública)
intercambia el contenido de dos tuple s
(función miembro pública)

Funciones no miembro

(C++11)
crea un objeto tuple del tipo definido por los tipos de argumento
(plantilla de función)
(C++11)
crea una tuple de referencias a lvalue o desempaca una tuple en objetos individuales
(plantilla de función)
crea una tuple de referencias de reenvío
(plantilla de función)
(C++11)
crea una tuple concatenando cualquier número de tuples
(plantilla de función)
accede al elemento especificado de la tuple
(plantilla de función)
(eliminado en C++20) (eliminado en C++20) (eliminado en C++20) (eliminado en C++20) (eliminado en C++20) (C++20)
compara lexicográficamente los valores en la tuple
(plantilla de función)
especializa el algoritmo std::swap
(plantilla de función)

Conceptos auxiliares

especifica que un tipo implementa el protocolo tuple
( std::get , std::tuple_element , std::tuple_size )
( concepto solo para exposición* )

Clases auxiliares

obtiene el tamaño de

un tuple
(especialización de plantilla de clase)

obtiene el tipo del elemento especificado
(especialización de plantilla de clase)
especializa el rasgo de tipo std::uses_allocator
(especialización de plantilla de clase)
determina el tipo de referencia común de un tuple y un tipo tuple-like
(especialización de plantilla de clase)
determina el tipo común de un tuple y un tipo tuple-like
(especialización de plantilla de clase)
soporte de formateo para tuple
(especialización de plantilla de clase)
(C++11)
marcador de posición para omitir un elemento al desempaquetar un tuple usando tie
(constante)

Especializaciones auxiliares

template < class ... Ts >

constexpr bool enable_nonlocking_formatter_optimization < std :: tuple < Ts... >>

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

Esta especialización de std::enable_nonlocking_formatter_optimization permite una implementación eficiente de std::print y std::println para imprimir un objeto tuple cuando cada tipo de elemento lo habilita.

Guías de deducción (desde C++17)

Notas

Dado que la "forma" de una tupla – su tamaño, los tipos de sus elementos y el orden de esos tipos – forman parte de su firma de tipo, todos deben estar disponibles en tiempo de compilación y solo pueden depender de otra información de tiempo de compilación. Esto significa que muchas operaciones condicionales sobre tuplas – en particular, la adición condicional al inicio/final y el filtrado – solo son posibles si las condiciones pueden evaluarse en tiempo de compilación. Por ejemplo, dada una std :: tuple < int , double , int > , es posible filtrar por tipos – por ejemplo, devolviendo una std :: tuple < int , int > – pero no filtrar según si cada elemento es positivo o no (lo que tendría una firma de tipo diferente dependiendo de los valores en tiempo de ejecución de la tupla), a menos que todos los elementos fueran en sí mismos constexpr .

Como solución alternativa, uno puede trabajar con tuplas de std:: optional , pero aún no hay forma de ajustar el tamaño basándose en información de tiempo de ejecución.

Hasta N4387 (aplicado como un informe de defectos para C++11), una función no podía retornar una tupla usando copy-list-initialization:

std::tuple<int, int> foo_tuple()
{
    return {1, -1};  // Error hasta N4387
    return std::tuple<int, int>{1, -1}; // Siempre funciona
    return std::make_tuple(1, -1); // Siempre funciona
}

Ejemplo

#include <iostream>
#include <stdexcept>
#include <string>
#include <tuple>
std::tuple<double, char, std::string> get_student(int id)
{
    switch (id)
    {
        case 0: return {3.8, 'A', "Lisa Simpson"};
        case 1: return {2.9, 'C', "Milhouse Van Houten"};
        case 2: return {1.7, 'D', "Ralph Wiggum"};
        case 3: return {0.6, 'F', "Bart Simpson"};
    }
    throw std::invalid_argument("id");
}
int main()
{
    const 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';
    const auto student1 = get_student(1);
    std::cout << "ID: 1, "
              << "GPA: " << std::get<double>(student1) << ", "
              << "grade: " << std::get<char>(student1) << ", "
              << "name: " << 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 << ", "
              << "grade: " << grade2 << ", "
              << "name: " << name2 << '\n';
    // C++17 structured binding:
    const auto [gpa3, grade3, name3] = get_student(3);
    std::cout << "ID: 3, "
              << "GPA: " << gpa3 << ", "
              << "grade: " << grade3 << ", "
              << "name: " << name3 << '\n';
}

Salida:

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
ID: 3, GPA: 0.6, grade: F, name: Bart Simpson

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Se aplica a Comportamiento publicado Comportamiento correcto
LWG 2796 C++11 la trivialidad del destructor de std::tuple no estaba especificada especificada
LWG 3990 C++11 un programa podía declarar una especialización explícita o
parcial de std::tuple
el programa está mal formado en este
caso (no se requiere diagnóstico)

Referencias

  • Estándar C++23 (ISO/IEC 14882:2024):
  • 22.4 Tuplas [tuple]
  • Estándar C++20 (ISO/IEC 14882:2020):
  • 20.5 Tuplas [tuple]
  • Estándar C++17 (ISO/IEC 14882:2017):
  • 23.5 Tuplas [tuple]
  • Estándar C++14 (ISO/IEC 14882:2014):
  • 20.4 Tuplas [tuple]
  • Estándar C++11 (ISO/IEC 14882:2011):
  • 20.4 Tuplas [tuple]

Véase también

implementa una tupla binaria, es decir, un par de valores
(class template)