Files
2025-10-25 03:02:53 +03:00

74 lines
2.4 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[variant.helper]
# 22 General utilities library [[utilities]](./#utilities)
## 22.6 Variants [[variant]](variant#helper)
### 22.6.4 variant helper classes [variant.helper]
[🔗](#lib:variant_size)
`template<class T> struct variant_size;
`
[1](#1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L6456)
All specializations of variant_size meet the[*Cpp17UnaryTypeTrait*](meta.rqmts#:Cpp17UnaryTypeTrait "21.3.2Requirements[meta.rqmts]") requirements ([[meta.rqmts]](meta.rqmts "21.3.2Requirements"))
with a base characteristic of integral_constant<size_t, N> for some N[.](#1.sentence-1)
[🔗](#lib:variant_size_)
`template<class T> struct variant_size<const T>;
`
[2](#2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L6468)
Let VS denote variant_size<T> of the cv-unqualified
type T[.](#2.sentence-1)
Then each specialization of the template meets the[*Cpp17UnaryTypeTrait*](meta.rqmts#:Cpp17UnaryTypeTrait "21.3.2Requirements[meta.rqmts]") requirements ([[meta.rqmts]](meta.rqmts "21.3.2Requirements")) with a
base characteristic of integral_constant<size_t, VS::value>[.](#2.sentence-2)
[🔗](#lib:variant_size__)
`template<class... Types>
struct variant_size<variant<Types...>> : integral_constant<size_t, sizeof...(Types)> { };
`
[🔗](#lib:variant_alternative)
`template<size_t I, class T> struct variant_alternative<I, const T>;
`
[3](#3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L6488)
Let VA denote variant_alternative<I, T> of the
cv-unqualified type T[.](#3.sentence-1)
Then each specialization of the template
meets the [*Cpp17TransformationTrait*](meta.rqmts#:Cpp17TransformationTrait "21.3.2Requirements[meta.rqmts]") requirements ([[meta.rqmts]](meta.rqmts "21.3.2Requirements")) with a
member typedef type that names the type add_const_t<VA::type>[.](#3.sentence-2)
[🔗](#lib:variant_alternative_)
`variant_alternative<I, variant<Types...>>::type
`
[4](#4)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L6501)
*Mandates*: I < sizeof...(Types)[.](#4.sentence-1)
[5](#5)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L6505)
*Type*: The type TI[.](#5.sentence-1)