Namespaces
Variants

std::variant_alternative, std::variant_alternative_t

Depuis fr.cppreference.net
 
 
Bibliothèque d'utilitaires
Support du langage
Support des types (types de base, RTTI)
Macros de test de fonctionnalités de la 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 <variant>
template <std::size_t I, class T>
struct variant_alternative; /* undefined */
(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)
(déprécié 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 (si présentes) avec les qualifications cv de l'alternative.

Formellement,

2) satisfait aux exigences de TransformationTrait avec un typedef membre type égal au type de l'alternative avec l'indice I
3) satisfait aux exigences de TransformationTrait avec un typedef membre type qui nomme, 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>>

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)