跳到主要内容

std::variant_size, std::variant_size_v

定义于头文件 <variant>

// 1)
template <class T>
struct variant_size; /* undefined */ // (since C++17)
// 2)
template <class... Types>
struct variant_size<std::variant<Types...>>
: std::integral_constant<std::size_t, sizeof...(Types)> { };// (since C++17)
// 3)
template <class T> class variant_size<const T>; // (since C++17)
// 3)
template <class T> class variant_size<volatile T>;
template <class T> class variant_size<const volatile T>; // (since C++17, deprecated in C++20)

以编译时常量表达式的形式,提供对可能经过 cv 限定的变体(variant)中替代数量的访问。

形式上,

满足 UnaryTypeTrait 要求,其基本特性为 std::integral_constant<std::size_t, sizeof...(Types)>

满足 UnaryTypeTrait 要求,其基本特性为 std::integral_constant<std::size_t, variant_size<T>>

辅助变量模板

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

继承自 std::integral_constant

成员常量

公有[静态]sizeof...(类型)
(公有静态成员常量)

成员函数

公有运算符 std::size_t将对象转换为 std::size_t,返回其值
(公共成员函数)
公有运算符()(C++14)返回值
(公共成员函数)

成员类型

|类型|定义| |::|::| |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.

std::variant_size, std::variant_size_v

定义于头文件 <variant>

// 1)
template <class T>
struct variant_size; /* undefined */ // (since C++17)
// 2)
template <class... Types>
struct variant_size<std::variant<Types...>>
: std::integral_constant<std::size_t, sizeof...(Types)> { };// (since C++17)
// 3)
template <class T> class variant_size<const T>; // (since C++17)
// 3)
template <class T> class variant_size<volatile T>;
template <class T> class variant_size<const volatile T>; // (since C++17, deprecated in C++20)

以编译时常量表达式的形式,提供对可能经过 cv 限定的变体(variant)中替代数量的访问。

形式上,

满足 UnaryTypeTrait 要求,其基本特性为 std::integral_constant<std::size_t, sizeof...(Types)>

满足 UnaryTypeTrait 要求,其基本特性为 std::integral_constant<std::size_t, variant_size<T>>

辅助变量模板

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

继承自 std::integral_constant

成员常量

公有[静态]sizeof...(类型)
(公有静态成员常量)

成员函数

公有运算符 std::size_t将对象转换为 std::size_t,返回其值
(公共成员函数)
公有运算符()(C++14)返回值
(公共成员函数)

成员类型

|类型|定义| |::|::| |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.