23 General utilities library [utilities]

23.7 Variants [variant]

23.7.4 variant helper classes [variant.helper]

template <class T> struct variant_size;
Remarks: All specializations of variant_­size shall meet the UnaryTypeTrait requirements ([meta.rqmts]) with a base characteristic of integral_­constant<size_­t, N> for some N.
template <class T> class variant_size<const T>; template <class T> class variant_size<volatile T>; template <class T> class variant_size<const volatile T>;
Let VS denote variant_­size<T> of the cv-unqualified type T.
Then each of the three templates shall meet the UnaryTypeTrait requirements ([meta.rqmts]) with a base characteristic of integral_­constant<size_­t, VS​::​value>.
template <class... Types> struct variant_size<variant<Types...>> : integral_constant<size_t, sizeof...(Types)> { };
template <size_t I, class T> class variant_alternative<I, const T>; template <size_t I, class T> class variant_alternative<I, volatile T>; template <size_t I, class T> class variant_alternative<I, const volatile T>;
Let VA denote variant_­alternative<I, T> of the cv-unqualified type T.
Then each of the three templates shall meet the TransformationTrait requirements ([meta.rqmts]) with a member typedef type that names the following type:
  • for the first specialization, add_­const_­t<VA​::​type>,
  • for the second specialization, add_­volatile_­t<VA​::​type>, and
  • for the third specialization, add_­cv_­t<VA​::​type>.
variant_alternative<I, variant<Types...>>::type
Requires: I < sizeof...(Types).
Value: The type .