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++.

Отчёт об ошибке Применяется к Опубликованное поведение Корректное поведение
LWG 2974 C++17 индекс за пределами допустимого диапазона приводил к неопределённому поведению сделано некорректным

См. также

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

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

Spec-Zone.ru

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