std::variant_alternative, std::variant_alternative_t
De es.cppreference.net
| Definido en el encabezado <variant>
|
||
template <std::size_t I, class T>
struct variant_alternative; /* undefined */
|
(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 en tiempo de compilación indexado 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 I3) 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>>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
Ejecutar 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>>); // 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
|
(C++17)
|
obtiene el tamaño de la lista de alternativas del
variant
en tiempo de compilación
(plantilla de clase) (plantilla de variable) |
|
(C++11)
|
obtiene el tipo del elemento especificado
(especialización de plantilla de clase) |