# std::variant_size, std::variant_size_v

< cpp‎ | utility‎ | variant

定义于头文件 `<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>; template <class T> class variant_size<const volatile T>; | (3) | (C++17 起) (C++20 中弃用)

提供作为编译时常量表达式，对可有 cv 限定的 `variant` 中可选项数量的访问。

正式地，

2) 满足基特征为 `std::integral_constant<std::size_t, sizeof...(Types)>` 的一元类型特征 (UnaryTypeTrait) 要求
3) 满足基特征为 `std::integral_constant<std::size_t, variant_size<T>>` 的一元类型特征 (UnaryTypeTrait) 要求

### 辅助变量模板

template <class T> inline constexpr std::size_t variant_size_v = std::variant_size<T>::value; |  | (C++17 起)

## 继承自 std::integral_constant

### 成员常量

value [静态] | `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` 的特化都满足以某些 `N` 的 `std::integral_constant<std::size_t, N>` 为基特征的一元类型特征 (UnaryTypeTrait) 。

### 示例

    #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_alternative variant_alternative_t (C++17) | 在编译时获得以其下标指定的可选项的类型 (类模板) (别名模板)
std::tuple_size<std::tuple> (C++11) | 在编译时获得 `tuple` 的大小 (类模板特化)