Namespaces
Variants

std:: tuple_element

From cppreference.net
Utilities library
Definido en el encabezado <tuple>
Definido en el encabezado <array>
Definido en el encabezado <utility>
Definido en el encabezado <ranges>
(desde C++20)
Definido en el encabezado <complex>
(desde C++26)
template < std:: size_t I, class T >
struct tuple_element ; // no definido
(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)
(obsoleto 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)
(obsoleto en C++20)

Proporciona acceso indexado en tiempo de compilación a los tipos de los elementos de un tipo tuple-like .

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

std::tuple_element interactúa con el núcleo del lenguaje: puede proporcionar structured binding support en el caso tipo-tupla.

(desde C++17)

Contenidos

Especializaciones

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

obtiene el tipo del elemento especificado
(especialización de plantilla de clase)
obtiene el tipo de los elementos de pair
(especialización de plantilla de clase)
obtiene el tipo de los elementos de array
(especialización de plantilla de clase)
obtiene el tipo del iterador o del centinela de un std::ranges::subrange
(especialización de plantilla de clase)
obtiene el tipo subyacente de número real e imaginario de un std::complex
(especialización de plantilla de clase)

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

En casos normales donde las get functions retornan miembros de referencia o referencia a subobjetos, solo se necesitan personalizar las especializaciones para tipos sin calificadores cv.

Tipos de miembros

Tipo de miembro Definición
type para una especialización estándar, el tipo del I th elemento del tipo tuple-like T , donde I está en [ 0 , std:: tuple_size < T > :: value )

Tipos auxiliares

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

Notas

Macro de prueba de características Valor Std Característica
__cpp_lib_tuple_element_t 201402L (C++14) std::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(false, "Índice no válido"); }; 
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 esperan 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 que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 2212 C++11 las especializaciones para tipos cv no eran requeridas en algunos encabezados, lo que llevaba a ambigüedad requerido

Véase también

Structured binding (C++17) vincula los nombres especificados a subobjetos o elementos de tupla del inicializador
(C++11)
obtiene el número de elementos de un tipo similar a tupla
(plantilla de clase)
(C++11)
crea un tuple concatenando cualquier número de tuplas
(plantilla de función)