Namespaces
Variants

std:: variant_alternative, std:: variant_alternative_t

From cppreference.net
Utilities library
Défini dans l'en-tête <variant>
template < std:: size_t I, class T >
struct variant_alternative ; /* indéfini */
(1) (depuis C++17)
template < std:: size_t I, class ... Types >
struct variant_alternative < I, variant < Types... >> ;
(2) (depuis C++17)
template < std:: size_t I, class T > class variant_alternative < I, const T > ;
(3) (depuis C++17)
template < std:: size_t I, class T >

class variant_alternative < I, volatile T > ;
template < std:: size_t I, class T >

class variant_alternative < I, const volatile T > ;
(3) (depuis C++17)
(obsolète en C++20)

Fournit un accès indexé à la compilation aux types des alternatives du variant éventuellement qualifié cv, en combinant les qualifications cv du variant (le cas échéant) avec les qualifications cv de l'alternative.

Formellement,

2) satisfait aux TransformationTrait exigences avec un typedef membre type égal au type de l'alternative avec l'index I
3) satisfait aux exigences TransformationTrait avec un typedef membre type qui désigne, respectivement, std:: add_const_t < std :: variant_alternative_t < I,T >> , std:: add_volatile_t < std :: variant_alternative_t < I,T >> , et std:: add_cv_t < std :: variant_alternative_t < I,T >>

Table des matières

Types membres

Type de membre Définition
type le type de la I -ème alternative du variant, où I doit être dans [0, sizeof...(Types)) , sinon le programme est mal formé.

Alias de modèle d'assistance

template < size_t I, class T >
using variant_alternative_t = typename variant_alternative < I, T > :: type ;
(depuis C++17)

Exemple

#include <variant>
#include <iostream>
using my_variant = std::variant<int, float>;
static_assert(std::is_same_v
    <int,   std::variant_alternative_t<0, my_variant>>);
static_assert(std::is_same_v
    <float, std::variant_alternative_t<1, my_variant>>);
// La qualification cv sur le type variant se propage au type alternatif extrait.
static_assert(std::is_same_v
    <const int, std::variant_alternative_t<0, const my_variant>>);
int main()
{
    std::cout << "All static assertions passed.\n";
}

Sortie :

All static assertions passed.

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 2974 C++17 un indice hors limites entraînait un comportement indéfini rendu mal formé

Voir aussi

obtient la taille de la liste d'alternatives de la variant au moment de la compilation
(modèle de classe) (modèle de variable)
obtient le type de l'élément spécifié
(spécialisation de modèle de classe)