Namespaces
Variants

std::tuple_element<std::pair>

De es.cppreference.net
 
 
Biblioteca de utilidades
Soporte del lenguaje
Soporte de tipos (tipos básicos, RTTI)
Macros de prueba de características de la biblioteca (C++20)
Utilidades de programa
Funciones variádicas
Soporte de corrutinas (C++20)
Soporte de contratos (C++26)
Comparación de tres vías
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

Utilidades generales
Operadores relacionales (obsoleto en C++20)
 
 
Definido en el encabezado <utility>
template< std::size_t I, class T1, class T2 >
struct tuple_element<I, std::pair<T1, T2>>;
(desde C++11)

Las especializaciones parciales de std::tuple_element para pares proporcionan acceso en tiempo de compilación a los tipos de los elementos del par, utilizando una sintaxis similar a la de tupla. El programa está mal formado si I >= 2.

Tipos de miembros

Tipo de miembro Definición
type T1 si I == 0
T2 si I == 1

Implementación posible

template<std::size_t I, typename T>
struct tuple_element;
template<std::size_t I, typename T1, typename T2>
struct tuple_element<I, std::pair<T1, T2>>
{
    static_assert(I < 2, "std::pair has only 2 elements!");
};
template<typename T1, typename T2>
struct tuple_element<0, std::pair<T1, T2>>
{
    using type = T1;
};
template<typename T1, typename T2>
struct tuple_element<1, std::pair<T1, T2>>
{
    using type = T2;
};

Ejemplo

#include <iostream>
#include <string>
#include <tuple>
namespace detail
{
    template<std::size_t>
    struct index_tag { constexpr explicit index_tag() = default; };
    template<class T, class U>
    constexpr T get_val_dispatch(std::pair<T, U> const& pair, index_tag<0>)
    {
        return pair.first;
    }
    template<class T, class U>
    constexpr U get_val_dispatch(std::pair<T, U> const& pair, index_tag<1>)
    {
        return pair.second;
    }
} // namespace detail
template<std::size_t N, class T, class U>
auto constexpr get_val(std::pair<T, U> const& pair)
    -> typename std::tuple_element<N, std::pair<T, U>>::type
{
    return detail::get_val_dispatch(pair, detail::index_tag<N>{});
}
int main()
{
    auto var = std::make_pair(1, std::string{"one"});
    std::cout << get_val<0>(var) << " = " << get_val<1>(var);
}

Salida:

1 = one

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares publicados anteriormente de C++.

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 2974 C++11 el índice fuera de límites refería a la plantilla principal no definida se hizo mal formado (error grave)

Véase también

Structured binding (C++17) vincula los nombres especificados a subobjetos o elementos de tupla del inicializador
obtiene el tipo del elemento especificado
(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 centinela de un std::ranges::subrange
(especialización de plantilla de clase)
obtiene el tamaño de un pair
(especialización de plantilla de clase)