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) |
Обеспечивает доступ к количеству альтернатив в варианте, возможно, с квалификаторами cv, как константу времени компиляции.
Формально,
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 > inline 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 <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("All static assertions passed.");
}Вывод:
All static assertions passed.
См. также
|
(C++17) | получает тип указанной альтернативы по ее индексу, во время компиляции (шаблон класса) (шаблон псевдонима) |
|
(C++11) | получает размер tuple во время компиляции (специализация шаблона класса) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/utility/variant/variant_size