std::tuple
De cppreference.com
<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 |
(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) | |
| Crea una tupla de referencias lvalue o desempaca una tupla en objetos individuales. (plantilla de función) | |
| Crea una tupla de referencias r-valor. (plantilla de función) | |
| Crea una tupla mediante la concatenación de cualquier número de tuplas. (plantilla de función) | |
| La tupla accede al elemento especificado. (plantilla de función) | |
| Compara lexicográficamente los valores de la tupla (plantilla de función) | |
(C++11) |
Especializa el algoritmo std::swap. (plantilla de función) |
Clases asistentes
| Obtiene el tamaño de una tupla en tiempo de compilación. (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) | |
| Marcador de posición para saltarse un elemento cuando se desempaca una tupla utilizando tie. (constante) |
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
Ejecuta este código
#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]