std:: tuple
|
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) |
|
(C++11)
|
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) |
|
(C++11)
|
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) |
|
(C++11)
|
especializa el algoritmo
std::swap
(plantilla de función) |
Conceptos auxiliares
|
(C++23)
|
especifica que un tipo implementa el
protocolo tuple
( std::get , std::tuple_element , std::tuple_size ) ( concepto solo para exposición* ) |
Clases auxiliares
|
(C++11)
|
obtiene el tamaño de
un
|
|
(C++11)
|
obtiene el tipo del elemento especificado
(especialización de plantilla de clase) |
|
(C++11)
|
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) |
|
|
(C++23)
|
determina el tipo común de un
tuple
y un tipo
tuple-like
(especialización de plantilla de clase) |
|
(C++23)
|
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...
>>
|
(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) |