23 General utilities library [utilities]

23.7 Variants [variant]

23.7.4 variant helper classes [variant.helper]

template <class T> struct variant_size;

Remarks: Все специализации variant_­size должны соответствовать UnaryTypeTrait требованиям с базовой характеристикой integral_­constant<size_­t, N> для некоторых 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>;

Обозначим VS через variant_­size<T> cv-неквалифицированный тип T. Тогда каждый из трех шаблонов должен соответствовать UnaryTypeTrait требованиям с базовой характеристикой 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>;

Обозначим VA через variant_­alternative<I, T> cv-неквалифицированный тип T. Затем каждый из трех шаблонов должен соответствовать TransformationTrait требованиям с помощью typedef члена, type который называет следующий тип:

  • для первой специализации add_­const_­t<VA​::​type>,

  • для второй специализации add_­volatile_­t<VA​::​type>, и

  • для третьей специализации add_­cv_­t<VA​::​type>.

variant_alternative<I, variant<Types...>>::type

Requires: I < sizeof...(Types).

Value: Тип TI.