Espacios de nombres
Variantes

std::tuple_element

De cppreference.com
 
 
Biblioteca de servicios
 
<tbody> </tbody>
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)

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.

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).

Tipos auxiliares

<tbody> </tbody>
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

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

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.

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]