Namespaces
Variants

std:: variant_alternative, std:: variant_alternative_t

From cppreference.net
Utilities library
Определено в заголовочном файле <variant>
template < std:: size_t I, class T >
struct variant_alternative ; /* не определено */
(1) (начиная с C++17)
template < std:: size_t I, class ... Types >
struct variant_alternative < I, variant < Types... >> ;
(2) (начиная с C++17)
template < std:: size_t I, class T > class variant_alternative < I, const T > ;
(3) (начиная с 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) (начиная с C++17)
(устарело в C++20)

Обеспечивает доступ по индексу на этапе компиляции к типам альтернатив возможно cv-квалифицированного варианта, объединяя cv-квалификаторы варианта (если есть) с cv-квалификаторами альтернативы.

Формально,

2) удовлетворяет TransformationTrait требованиям с typedef-членом type равным типу альтернативы с индексом I
3) удовлетворяет TransformationTrait требованиям с typedef-членом type , который обозначает, соответственно, std:: add_const_t < std :: variant_alternative_t < I,T >> , std:: add_volatile_t < std :: variant_alternative_t < I,T >> , и std:: add_cv_t < std :: variant_alternative_t < I,T >>

Содержание

Типы членов

Тип члена Определение
type тип I -й альтернативы варианта, где I должен находиться в диапазоне [0, sizeof...(Types)) , иначе программа является некорректной.

Вспомогательный псевдоним шаблона

template < size_t I, class T >
using variant_alternative_t = typename variant_alternative < I, T > :: type ;
(начиная с C++17)

Пример

#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>>);
// cv-квалификация типа variant распространяется на извлекаемый альтернативный тип.
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";
}

Вывод:

All static assertions passed.

Отчеты о дефектах

Следующие отчеты об изменениях в поведении, содержащие описания дефектов, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Applied to Behavior as published Correct behavior
LWG 2974 C++17 out-of-bounds index resulted in undefined behavior made ill-formed

Смотрите также

получает размер списка альтернатив variant во время компиляции
(шаблон класса) (шаблон переменной)
получает тип указанного элемента
(специализация шаблона класса)