Namespaces
Variants

std:: tuple_element

From cppreference.net
Utilities library
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 ; // non défini
(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)
(obsolète 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)
(obsolète en C++20)

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

1) Le modèle principal n'est pas défini. Une spécialisation explicite (complète) ou partielle est requise pour rendre un type tuple-like.
2-4) Les spécialisations pour les types qualifiés cv ajoutent simplement les qualificatifs cv correspondants par défaut.

std::tuple_element interagit avec le langage de base : il peut fournir structured binding support dans le cas tuple-like.

(depuis C++17)

Table des matières

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)