Namespaces
Variants

std:: variant_alternative, std:: variant_alternative_t

From cppreference.net
Utilities library
Definido en el encabezado <variant>
template < std:: size_t I, class T >
struct variant_alternative ; /* indefinido */
(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, const volatile T > ;
(3) (desde C++17)
(obsoleto en C++20)

Proporciona acceso indexado en tiempo de compilación a los tipos de las alternativas del variant posiblemente calificado con cv, combinando las calificaciones cv del variant (si las hay) con las calificaciones cv de la alternativa.

Formalmente,

2) cumple con los requisitos de TransformationTrait con un typedef miembro type igual al tipo de la alternativa con índice I
3) cumple con los requisitos de TransformationTrait con un typedef miembro type que nombra, respectivamente, 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 >>

Contenidos

Tipos de miembros

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

Alias de plantilla auxiliar

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

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>>);
// La calificación cv en el tipo variant se propaga al tipo alternativo extraído.
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";
}

Salida:

All static assertions passed.

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 2974 C++17 el índice fuera de límites resultaba en comportamiento indefinido se convierte en mal formado

Véase también

obtiene el tamaño de la lista de alternativas del variant en tiempo de compilación
(plantilla de clase) (plantilla de variable)
obtiene el tipo del elemento especificado
(especialización de plantilla de clase)