std::variant_alternative, std::variant_alternative_t
Depuis fr.cppreference.net
| 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 I3) 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
Exécuter ce code
#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
|
(C++17)
|
obtient la taille de la liste d'alternatives de la
variant
au moment de la compilation
(modèle de classe) (modèle de variable) |
|
(C++11)
|
obtient le type de l'élément spécifié
(spécialisation de modèle de classe) |