std::variant_alternative, std::variant_alternative_t
Материал из cppreference.com
<tbody>
</tbody>
| Определено в заголовочном файле <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-квалифицированного, variant, комбинируя cv-квалификацию variant (если есть) с cv-квалификацией альтернативы.
Формально,
2) соответствует требованиям TransformationTrait с typedef элементом
type, равным типу альтернативы с индексом I3) соответствует требованиям 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-й альтернативы variant, где I должна быть в [0, sizeof...(Types)), иначе программа некорректна.
|
Вспомогательный шаблон псевдоним
<tbody> </tbody> 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 << "Все статические утверждения пройдены.\n";
}
Вывод:
Все статические утверждения пройдены.
Отчёты о дефектах
Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:
| Номер | Применён | Поведение в стандарте | Корректное поведение |
|---|---|---|---|
| LWG 2974 | c++17 | выход индекса за границы приводил к неопределённому поведению | сделано некорректным |
Смотрите также
(C++17) |
получает размер списка альтернатив во время компиляции (шаблон класса) (шаблонная переменная) |
| получает тип указанного элемента (специализация шаблона класса) |