Espacios de nombres
Variantes
Acciones

std::tuple_element

De cppreference.com
< cpp‎ | utility
 
 
Biblioteca de servicios
Servicios generales
Operadores relacionales (en desuso en C++20)
Funciones de comparación de enteros
(C++20)(C++20)(C++20)  
(C++20)
Intercambio y operaciones de tipos
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Tipos vocabulario comunes
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
tuple_element
(C++11)
(C++17)
(C++23)



 
Definido en el archivo de encabezado <tuple>
Definido en el archivo de encabezado <array>
Definido en el archivo de encabezado <utility>
Definido en el archivo de encabezado <ranges>
(desde C++20)
template< std::size_t I, class T >
struct tuple_element; // not defined
(1) (desde C++11)
template< std::size_t I, class T >

struct tuple_element< I, const T > {
    using type = typename
        std::add_const<typename std::tuple_element<I, T>::type>::type;

};
(2) (desde C++11)
template< std::size_t I, class T >

struct tuple_element< I, volatile T > {
    using type = typename
        std::add_volatile<typename std::tuple_element<I, T>::type>::type;

};
(3) (desde C++11)
(en desuso en C++20)
template< std::size_t I, class T >

struct tuple_element< I, const volatile T > {
    using type = typename
        std::add_cv<typename std::tuple_element<I, T>::type>::type;

};
(4) (desde C++11)
(en desuso en C++20)

Proporciona acceso indexado en tiempo de compilación a los tipos de los elementos de un tipo similar a una tupla.

1) La plantilla principal no está definida. Se requiere una especialización explícita (total) o parcial para hacer un tipo similar a una tupla.
2-4) Las especializaciones para tipos calificados-cv simplemente agregan por defecto los calificadores-cv.

std::tuple_element interactúa con el lenguaje central: puede proporcionar apoyo de vínculo estructurado en el caso similar a una tupla.

(desde C++17)

Contenido

[editar] Especializaciones

La biblioteca estándar proporciona las siguientes especializaciones para los tipos de la biblioteca estándar:

Obtiene el tipo del elemento especificado.
(especialización de plantilla de clase) [editar]
Obtiene el tipo de los elementos de un par.
(especialización de plantilla de clase) [editar]
se obtiene el tipo de los elementos de array
Original:
obtains the type of the elements of array
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.

(especialización de plantilla de clase) [editar]
Obtiene el tipo del iterador o el centinela de un subrango (std::ranges::subrange).
(especialización de plantilla de clase) [editar]

Los usuarios pueden especializar std::tuple_element para tipos definidos por el programa para hacerlos similares a una tupla.

En casos normales donde las funciones get devuelven miembros referencia o referencias a subobjetos, solo las especializaciones para tipos no calificados-cv necesitan personalizarse.

[editar] Tipos miembro

Tipo miembro Definición
type Para una especialización estándar, el tipo del I-ésimo elemento del tipo similar a una tupla T, donde I está en [0, std::tuple_size<T>::value).

[editar] Tipos auxiliares

Definido en el archivo de encabezado <tuple>
template <std::size_t I, class T>
using tuple_element_t = typename tuple_element<I, T>::type;
(desde C++14)


Macro de Prueba de característica
__cpp_lib_tuple_element_t

[editar] Ejemplo

#include <array>
#include <cstddef>
#include <iostream>
#include <ranges>
#include <tuple>
#include <type_traits>
#include <utility>
 
template <typename T1, typename T2, typename T3>
    struct Triple { T1 t1; T2 t2; T3 t3; };
 
// Una especialización de std::tuple_element para el tipo definido por el programa Triple:
template <std::size_t I, typename T1, typename T2, typename T3>
    struct std::tuple_element<I, Triple<T1, T2, T3>> { static_assert(I < 4); };
template <typename T1, typename T2, typename T3>
    struct std::tuple_element<0, Triple<T1, T2, T3>> { using type = T1; };
template <typename T1, typename T2, typename T3>
    struct std::tuple_element<1, Triple<T1, T2, T3>> { using type = T2; };
template <typename T1, typename T2, typename T3>
    struct std::tuple_element<2, Triple<T1, T2, T3>> { using type = T3; };
 
 
template <typename... Args> struct TripleTypes {
    static_assert(3 == sizeof...(Args), "¡Se esperaban exactamente 3 nombres de tipo!");
    template <std::size_t N>
        using type = typename std::tuple_element_t<N, Triple<Args...>>;
};
 
int main()
{
    TripleTypes<char, int, float>::type<1> i{42};
    std::cout << i << '\n';
 
    using Tri = Triple<int, char, short>; //< Tipo definido por el programa
    static_assert(std::is_same_v<std::tuple_element_t<0, Tri>, int> &&
                  std::is_same_v<std::tuple_element_t<1, Tri>, char> &&
                  std::is_same_v<std::tuple_element_t<2, Tri>, short>);
 
    using Tuple = std::tuple<int, char, short>;
    static_assert(std::is_same_v<std::tuple_element_t<0, Tuple>, int> &&
                  std::is_same_v<std::tuple_element_t<1, Tuple>, char> &&
                  std::is_same_v<std::tuple_element_t<2, Tuple>, short>);
 
    using Array3 = std::array<int, 3>;
    static_assert(std::is_same_v<std::tuple_element_t<0, Array3>, int> &&
                  std::is_same_v<std::tuple_element_t<1, Array3>, int> &&
                  std::is_same_v<std::tuple_element_t<2, Array3>, int>);
 
    using Pair = std::pair<Tuple, Tri>;
    static_assert(std::is_same_v<std::tuple_element_t<0, Pair>, Tuple> &&
                  std::is_same_v<std::tuple_element_t<1, Pair>, Tri>);
 
    using Sub = std::ranges::subrange<int*, int*>;
    static_assert(std::is_same_v<std::tuple_element_t<0, Sub>, int*> &&
                  std::is_same_v<std::tuple_element_t<1, Sub>, int*>);
}

Salida:

42

[editar] Informes de defectos

Los siguientes informes de defectos de cambio de comportamiento se aplicaron de manera retroactiva a los estándares de C++ publicados anteriormente.

ID Aplicado a Comportamiento según lo publicado Comportamiento correcto
LWG 2212 C++11 No se requerían las especializaciones para tipos cv en algunos archivos de encabezado, lo que conducía a ambigüedad. Se requiere.

[editar] Véase también

Vínculo estructurado (C++17) Vincula los nombres especificados a subobjetos o elementos de una tupla del inicializador. [editar]
Obtiene el número de elementos de un tipo similar a una tupla.
(plantilla de clase) [editar]
Crea una tupla mediante la concatenación de cualquier número de tuplas.
(plantilla de función) [editar]