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.