Namespaces
Variants

std:: tuple_element <std::pair>

From cppreference.net
Utilities library
Défini dans l'en-tête <utility>
template < std:: size_t I, class T1, class T2 >
struct tuple_element < I, std:: pair < T1, T2 >> ;
(depuis C++11)

Les spécialisations partielles de std:: tuple_element pour les paires fournissent un accès à la compilation aux types des éléments de la paire, en utilisant une syntaxe de type tuple. Le programme est mal formé si I >= 2 .

Table des matières

Types membres

Type de membre Définition
type T1 si I == 0
T2 si I == 1

Implémentation possible

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 a seulement 2 éléments !");
};
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;
};

Exemple

#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);
}

Sortie :

1 = one

Rapports de défauts

Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.

DR Appliqué à Comportement tel que publié Comportement correct
LWG 2974 C++11 l'index hors limites référençait le template primaire non défini rendu mal formé (erreur fatale)

Voir aussi

Structured binding (C++17) lie les noms spécifiés aux sous-objets ou éléments de tuple de l'initialiseur
obtient le type de l'élément spécifié
(spécialisation de modèle de classe)
obtient le type des éléments du array
(spécialisation de modèle de classe)
obtient le type de l'itérateur ou du sentinelle d'un std::ranges::subrange
(spécialisation de modèle de classe)
obtient la taille d'une pair
(spécialisation de modèle de classe)