Пространства имён
Варианты
Действия

std::variant_size, std::variant_size_v

Материал из cppreference.com
 
 
Библиотека утилит
Языковая поддержка
Поддержка типов (базовые типы, RTTI)
Макросы тестирования функциональности библиотеки (C++20)    
Управление динамической памятью
Программные утилиты
Поддержка сопрограмм (C++20)
Вариативные функции
Трёхстороннее сравнение (C++20)
(C++20)
(C++20)(C++20)(C++20)(C++20)(C++20)(C++20)
Общие утилиты
Дата и время
Функциональные объекты
Библиотека форматирования (C++20)
(C++11)
Операторы отношения (устарело в C++20)
Целочисленные функции сравнения
(C++20)(C++20)(C++20)    
(C++20)
Операции обмена и типа
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Общие лексические типы
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
Элементарные преобразования строк
(C++17)
(C++17)
 
 
<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("Все статические утверждения пройдены."); }

Вывод:

Все статические утверждения пройдены.

Смотрите также

получает тип альтернативы, указанный её индексом, во время компиляции
(шаблон класса) (псевдоним шаблона) [править]
получает размер tuple во время компиляции
(специализация шаблона класса) [править]