Namespaces
Variants

std:: tuple_element <std::pair>

From cppreference.net
Utilities library
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, usando sintaxis tipo tupla. El programa está mal formado si I >= 2 .

Contenidos

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)