std::variant_alternative, std::variant_alternative_t
De cppreference.com
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>; |
(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
Ejecuta este código
#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.
[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
(C++17) |
Obtiene el tamaño de la lista de alternativas del variante en tiempo de compilación. (plantilla de clase) (plantilla de variables) |
Obtiene el tipo del elemento especificado. (especialización de plantilla de clase) |