std::variant_size, std::variant_size_v
Материал из cppreference.com
<tbody>
</tbody>
| Определено в заголовочном файле <variant>
|
||
template <class T> struct variant_size; /* неопределено */ |
(1) | (начиная с C++17) |
template <class... Types> struct variant_size<std::variant<Types...>> : std::integral_constant<std::size_t, sizeof...(Types)> { }; |
(2) | (начиная с C++17) |
template <class T> class variant_size<const T>; |
(3) | (начиная с C++17) |
template <class T> class variant_size<volatile T>; template <class T> class variant_size<const volatile T>; |
(3) | (начиная с C++17) (устарело в C++20) |
Предоставляет доступ к числу альтернатив в, возможно cv-квалифицированном, variant в виде константного выражения времени компиляции.
Формально,
2) соответствует требованиям UnaryTypeTrait с базовой характеристикой
std::integral_constant<std::size_t, sizeof...(Types)>3) соответствует требованиям UnaryTypeTrait с базовой характеристикой
std::integral_constant<std::size_t, variant_size<T>>Шаблон вспомогательной переменной
<tbody> </tbody> template <class T> inline constexpr std::size_t variant_size_v = std::variant_size<T>::value; |
(начиная с C++17) | |
Унаследован от std::integral_constant
Константы элементы
value [static] |
sizeof...(Types) (public static константа-элемент) |
Функции-элементы
operator std::size_t |
преобразует объект в std::size_t, возвращает value (public функция-элемент) |
operator() (C++14) |
возвращает value (public функция-элемент) |
Типы элементы
| Тип | Определение |
value_type
|
std::size_t
|
type
|
std::integral_constant<std::size_t, value>
|
Примечание
Все специализации std::variant_size соответствуют UnaryTypeTrait с базовой характеристикой std::integral_constant<std::size_t, N> для некоторых N.
Пример
Запустить этот код
#include <any>
#include <cstdio>
#include <variant>
static_assert(std::variant_size_v<std::variant<>> == 0);
static_assert(std::variant_size_v<std::variant<int>> == 1);
static_assert(std::variant_size_v<std::variant<int, int>> == 2);
static_assert(std::variant_size_v<std::variant<int, int, int>> == 3);
static_assert(std::variant_size_v<std::variant<int, float, double>> == 3);
static_assert(std::variant_size_v<std::variant<std::monostate, void>> == 2);
static_assert(std::variant_size_v<std::variant<const int, const float>> == 2);
static_assert(std::variant_size_v<std::variant<std::variant<std::any>>> == 1);
int main() { std::puts("Все статические утверждения пройдены."); }
Вывод:
Все статические утверждения пройдены.
Смотрите также
| получает тип альтернативы, указанный её индексом, во время компиляции (шаблон класса) (псевдоним шаблона) | |
(C++11) |
получает размер tuple во время компиляции (специализация шаблона класса) |