std::variant_size, std::variant_size_v
Определён в заголовочном файле <variant> | ||
|---|---|---|
template< class T > struct variant_size; /* undefined */ | (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>; | (4) | (начиная с C++17) (устарело в C++20) |
template< class T > class variant_size<const volatile T>; | (5) | (начиная с C++17) (устарело в C++20) |
Предоставляет доступ к количеству альтернатив в possibly cv-qualified варианте в виде константного выражения времени компиляции.
Формально,
2) соответствует требованиям UnaryTypeTrait с базовой характеристикой std::integral_constant<std::size_t,sizeof...(Types)>
3-5) соответствуют требованиям UnaryTypeTrait с базовой характеристикой std::integral_constant<std::size_t,std::variant_size<T>::value>
Вспомогательный шаблон переменной
template< class T > constexpr std::size_t variant_size_v = std::variant_size<T>::value; | (начиная с C++17) |
Унаследовано от std::integral_constant
Константы-члены
|
value
[static] |
sizeof...(Types) (открытая статическая константа-член) |
Функции-члены
|
operator std::size_t | преобразует объект в std::size_t, возвращает value (открытая функция-член) |
|
operator()
(C++14) | возвращает value (открытая функция-член) |
Типы-члены
| Тип | Определение |
|---|---|
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 <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() {}
См. также
|
(C++17) | получает тип альтернативы, заданной индексом, во время компиляции (шаблон класса) (шаблон псевдонима) |
|
(C++11) | получает размер
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/utility/variant/variant_size