Espacios de nombres
Variantes

std::variant_alternative, std::variant_alternative_t

De cppreference.com
 
 
Biblioteca de servicios
Apoyo del lenguaje
Apoyo de tipos (tipos básicos, RTTI)
Macros de prueba de característica de la biblioteca (C++20)
Servicios de programa
Funciones variádicas
Apoyo de corrutinas (C++20)
Apoyo de contratos (C++26)
Comparación de tres vías (C++20)
(C++20)
(C++20)(C++20)(C++20)  
(C++20)(C++20)(C++20)

 
 
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, const volatile 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>>.

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.

Plantilla de alias 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>>);
// calificación-cv sobre el tipo variante 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 << "Pasaron todas las aserciones estáticas.\n";
}

Salida:

Pasaron todas las aserciones estáticas.

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

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]