Spec-Zone.ru › C++

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.

См. также

variant_alternativevariant_alternative_t
(C++17)
получает тип указанной альтернативы по ее индексу, во время компиляции
(шаблон класса) (шаблон псевдонима)
std::tuple_size<std::tuple>
(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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API