Spec-Zone.ru › C++

std::variant_alternative, std::variant_alternative_t

Определено в заголовке <variant>
template <std::size_t I, class T>
struct variant_alternative; /* undefined */
(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 с типом-членом type, равным типу альтернативы с индексом I
3) соответствует требованиям TransformationTrait с типом-членом 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-qualification on the variant type propagates to the extracted alternative type.
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 Применено к Поведение, как опубликовано Корректное поведение
LWG 2974 C++17 Индекс за пределами границ приводил к неопределённому поведению Сделано некорректным

См. также

variant_sizevariant_size_v
(C++17)
Получает размер списка альтернатив переменной во время компиляции
(шаблон класса) (шаблон переменной)
std::tuple_element<std::tuple>
(C++11)
Получает тип указанного элемента
(специализация шаблона класса)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/utility/variant/variant_alternative

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API