std:: variant_alternative, std:: variant_alternative_t
|
Определено в заголовочном файле
<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
>
;
|
(3) |
(начиная с C++17)
(устарело в C++20) |
Обеспечивает доступ по индексу на этапе компиляции к типам альтернатив возможно cv-квалифицированного варианта, объединяя cv-квалификаторы варианта (если есть) с cv-квалификаторами альтернативы.
Формально,
type
равным типу альтернативы с индексом
I
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 |
Смотрите также
|
(C++17)
|
получает размер списка альтернатив
variant
во время компиляции
(шаблон класса) (шаблон переменной) |
|
(C++11)
|
получает тип указанного элемента
(специализация шаблона класса) |