Espacios de nombres
Variantes

std::tuple

De cppreference.com
 
 
Biblioteca de servicios
 
 
<tbody> </tbody>
Definido en el archivo de 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_v<Types> && ...) es true, el destructor de tuple es trivial.

(desde C++17)

Parámetros de plantilla

Types... - Los tipos de elementos que la tupla almacena. Se soporta una lista vacía.

Funciones miembro

Construye una nueva tupla
(función miembro pública)
Asigna el contenido de una tupla a otra.
(función miembro pública)
Intercambia el contenido de dos tuplas.
(función miembro pública)

Funciones no miembro

Crea un objeto de tupla del tipo definido por los tipos de argumentos.
(plantilla de función) [editar]
Crea una tupla de referencias lvalue o desempaca una tupla en objetos individuales.
(plantilla de función) [editar]
Crea una tupla de referencias r-valor.
(plantilla de función) [editar]
Crea una tupla mediante la concatenación de cualquier número de tuplas.
(plantilla de función) [editar]
La tupla accede al elemento especificado.
(plantilla de función) [editar]
Compara lexicográficamente los valores de la tupla
(plantilla de función) [editar]
Especializa el algoritmo std::swap.
(plantilla de función) [editar]

Clases asistentes

Obtiene el tamaño de una tupla en tiempo de compilación.
(especialización de plantilla de clase) [editar]
Obtiene el tipo del elemento especificado.
(especialización de plantilla de clase) [editar]
Especializa el rasgo de tipo std::uses_allocator.
(especialización de plantilla de clase) [editar]
Marcador de posición para saltarse un elemento cuando se desempaca una tupla utilizando tie.
(constante) [editar]

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

Notas

Hasta N4387 (aplicado como un informe de defecto de C++11), una función no podía devolver una tupla usando inicialización de lista de copia:

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 <tuple>
#include <iostream>
#include <string>
#include <stdexcept>

std::tuple<double, char, std::string> captar_estudiante(int id)
{
    if (id == 0) return std::make_tuple(3.8, 'A', "Alicia Alderete");
    if (id == 1) return std::make_tuple(2.9, 'C', "Benito Barajas");
    if (id == 2) return std::make_tuple(1.7, 'D', "Carlos Cabello");
    throw std::invalid_argument("id");
}

int main()
{
    auto estudiante0 = captar_estudiante(0);
    std::cout << "ID: 0, "
              << "PROM: " << std::get<0>(estudiante0) << ", "
              << "calif: " << std::get<1>(estudiante0) << ", "
              << "nombre: " << std::get<2>(estudiante0) << '\n';

    double prom1;
    char calif1;
    std::string name1;
    std::tie(prom1, calif1, nombre1) = captar_estudiante(1);
    std::cout << "ID: 1, "
              << "PROM: " << prom1 << ", "
              << "calif: " << calif1 << ", "
              << "name: " << nombre1 << '\n';

    // C++17: vínculo estructurado
    auto [ prom2, calif2, nombre2 ] = captar_estudiante(2);
    std::cout << "ID: 2, "
              << "PROM: " << nombre << ", "
              << "calif: " << calif2 << ", "
              << "nombre: " << nombre2 << '\n';
}

Salida:

ID: 0, PROM: 3.8, calif: A, nombre: Alicia Alderete
ID: 1, PROM: 2.9, calif: C, nombre: Benito Barajas
ID: 2, PROM: 1.7, calif: D, nombre: Carlos Cabello

Referencias

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