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 | индекс за пределами допустимого диапазона приводил к неопределённому поведению | сделано некорректным |
См. также
|
(C++17) | получает размер списка альтернатив variant во время компиляции(шаблон класса) (шаблон переменной) |
|
(C++11) | получает тип указанного элемента (специализация шаблона класса) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/utility/variant/variant_alternative