Espacios de nombres
Variantes
Acciones

std::variant_alternative, std::variant_alternative_t

De cppreference.com
< cpp‎ | utility‎ | variant
 
 
Biblioteca de servicios
 
 
Definido en el archivo de encabezado <variant>
template<std::size_t I, class T>
struct variant_alternative;/* sin definir */
(1) (desde C++17)
template<std::size_t I, class... Types>
struct variant_alternative<I, variant<Types...>>;
(2) (desde C++17)
template<std::size_t I, class T>class variant_alternative<I, const T>;
(3) (desde 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, constvolatile T>;
(3) (desde C++17)
(en desuso en C++20)

Proporciona accesso de subíndice en tiempo de compilación a los tipos de las alternativas del variante posiblemente calificado-cv, combinando las calificaciones-cv del variante (si es que las hay) con las calificaciones-cv de la alternativa.

Formalmente,

2) cumple con los requerimientos de TransformationTrait con una definición de tipo (typedef) miembro type igual al tipo de la alternativa con subíndice I;
3) cumple con los requerimientos de TransformationTrait con una definición de tipo (typedef) miembro type que denomina, respectivamente, a std::add_const_t<std::variant_alternative_t<I,T>>, std::add_volatile_t<std::variant_alternative_t<I,T>>, y std::add_cv_t<std::variant_alternative_t<I,T>>.

Contenido

[editar]Tipos miembro

Tipo miembro Definición
type El tipo de la I-ésima alternativa del variante, donde I debe estar en [0, sizeof...(Types)); de lo contrario, el programa está mal formado.

[editar]Plantilla de alias auxiliar

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

[editar]Ejemplo

#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>>);// calificación-cv sobre el tipo variante se propaga al tipo alternativo extraído. static_assert(std::is_same_v<constint, std::variant_alternative_t<0, const my_variant>>);   int main(){std::cout<<"Pasaron todas las aserciones estáticas.\n";}

Salida:

Pasaron todas las aserciones estáticas.

[editar]Informes de defectos

Los siguientes informes de defectos de cambio de comportamiento se aplicaron de manera retroactiva a los estándares de C++ publicados anteriormente.

ID Aplicado a Comportamiento según lo publicado Comportamiento correcto
LWG 2974 C++17 Subíndice fuera de límites resultaba en comportamiento indefinido Se hizo mal formado

[editar]Véase también

Obtiene el tamaño de la lista de alternativas del variante en tiempo de compilación.
(plantilla de clase)(plantilla de variables)[editar]
Obtiene el tipo del elemento especificado.
(especialización de plantilla de clase)[editar]
close