Namespaces
Variants

std::tuple_element

Depuis fr.cppreference.net
 
 
Bibliothèque d'utilitaires
Support linguistique
Support des types (types de base, RTTI)
Macros de test de fonctionnalités de bibliothèque (C++20)
Utilitaires de programme
Fonctions variadiques
Support des coroutines (C++20)
Support des contrats (C++26)
Comparaison à trois voies
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

Utilitaires généraux
Opérateurs relationnels (déprécié en C++20)
 
Défini dans l'en-tête <tuple>
Défini dans l'en-tête <array>
Défini dans l'en-tête <utility>
Défini dans l'en-tête <ranges>
(depuis C++20)
Défini dans l'en-tête <complex>
(depuis C++26)
template< std::size_t I, class T >
struct tuple_element; // not defined
(1) (depuis 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) (depuis 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) (depuis C++11)
(déprécié 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) (depuis C++11)
(déprécié en C++20)

Fournit un accès indexé à la compilation aux types des éléments d'un type semblable à un tuple.

1) Le modèle primaire n'est pas défini. Une spécialisation explicite (totale) ou partielle est nécessaire pour rendre un type semblable à un tuple.
2-4) Les spécialisations pour les types qualifiés cv ajoutent simplement les qualificateurs cv correspondants par défaut.

std::tuple_element interagit avec le langage de base : il peut fournir le support des liaisons structurées dans le cas semblable à un tuple.

(depuis C++17)

Spécialisations

La bibliothèque standard fournit les spécialisations suivantes pour les types de la bibliothèque standard :

obtient le type de l'élément spécifié
(spécialisation de modèle de classe)
obtient le type des éléments du pair
(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 le type sous-jacent des nombres réels et imaginaires d'un std::complex
(spécialisation de modèle de classe)

Les utilisateurs peuvent spécialiser std::tuple_element pour les types définis par le programme afin de les rendre similaires à un tuple.

Dans les cas normaux où les get fonctions retournent des membres référence ou des références à des sous-objets, seules les spécialisations pour les types non qualifiés cv doivent être personnalisées.

Types membres

Type de membre Définition
type pour une spécialisation standard, le type du I ème élément du type tuple-like T , où I est dans [ 0 , std:: tuple_size < T > :: value )

Types auxiliaires

Défini dans l'en-tête <tuple>
template < std:: size_t I, class T >
using tuple_element_t = typename tuple_element < I, T > :: type ;
(depuis C++14)

Notes

Macro de test de fonctionnalité Valeur Std Fonctionnalité
__cpp_lib_tuple_element_t 201402L (C++14) std::tuple_element_t

Exemple

#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;
};
// Une spécialisation de std::tuple_element pour le type défini par le programme Triple :
template<std::size_t I, typename T1, typename T2, typename T3>
    struct std::tuple_element<I, Triple<T1, T2, T3>>
    { static_assert(false, "Index invalide"); }; 
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), "Exactement 3 noms de type attendus");
    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>; //< Type défini par le programme
    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*>);
}

Sortie :

42

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 publié Comportement corrigé
LWG 2212 C++11 les spécialisations pour les types cv n'étaient pas requises dans certains en-têtes, ce qui conduisait à une ambiguïté requis

Voir aussi

Structured binding (C++17) lie les noms spécifiés aux sous-objets ou éléments de tuple de l'initialiseur
(C++11)
obtient le nombre d'éléments d'un type similaire à un tuple
(modèle de classe)
(C++11)
crée un tuple en concaténant n'importe quel nombre de tuples
(modèle de fonction)