22 General utilities library [utilities]
#include <compare>
namespace std {
template<class. Types>
class variant;
template<class T> struct variant_size;
template<class T> struct variant_size<const T>;
template<class T>
constexpr size_t variant_size_v = variant_size<T>::value;
template<class. Types>
struct variant_size<variant<Types..>;
template<size_t I, class T> struct variant_alternative;
template<size_t I, class T> struct variant_alternative<I, const T>;
template<size_t I, class T>
using variant_alternative_t = variant_alternative<I, T>::type;
template<size_t I, class. Types>
struct variant_alternative<I, variant<Types..>;
inline constexpr size_t variant_npos = -1;
template<class T, class. Types>
constexpr bool holds_alternative(const variant<Types..>&) noexcept;
template<size_t I, class. Types>
constexpr variant_alternative_t<I, variant<Types..>&
get(variant<Types..>&);
template<size_t I, class. Types>
constexpr variant_alternative_t<I, variant<Types..>&
get(variant<Types..>&);
template<size_t I, class. Types>
constexpr const variant_alternative_t<I, variant<Types..>&
get(const variant<Types..>&);
template<size_t I, class. Types>
constexpr const variant_alternative_t<I, variant<Types..>&
get(const variant<Types..>&);
template<class T, class. Types>
constexpr T& get(variant<Types..>&);
template<class T, class. Types>
constexpr T&& get(variant<Types..>&);
template<class T, class. Types>
constexpr const T& get(const variant<Types..>&);
template<class T, class. Types>
constexpr const T&& get(const variant<Types..>&);
template<size_t I, class. Types>
constexpr add_pointer_t<variant_alternative_t<I, variant<Types..>
get_if(variant<Types..>*) noexcept;
template<size_t I, class. Types>
constexpr add_pointer_t<const variant_alternative_t<I, variant<Types..>
get_if(const variant<Types..>*) noexcept;
template<class T, class. Types>
constexpr add_pointer_t<T>
get_if(variant<Types..>*) noexcept;
template<class T, class. Types>
constexpr add_pointer_t<const T>
get_if(const variant<Types..>*) noexcept;
template<class. Types>
constexpr bool operator=(const variant<Types..>&, const variant<Types..>&);
template<class. Types>
constexpr bool operator!=(const variant<Types..>&, const variant<Types..>&);
template<class. Types>
constexpr bool operator<(const variant<Types..>&, const variant<Types..>&);
template<class. Types>
constexpr bool operator>(const variant<Types..>&, const variant<Types..>&);
template<class. Types>
constexpr bool operator<=(const variant<Types..>&, const variant<Types..>&);
template<class. Types>
constexpr bool operator>=(const variant<Types..>&, const variant<Types..>&);
template<class. Types> requires (three_way_comparable<Types> && ..)
constexpr common_comparison_category_t<compare_three_way_result_t<Types>.>
operator<=>(const variant<Types..>&, const variant<Types..>&);
template<class Visitor, class. Variants>
constexpr see below visit(Visitor&&, Variants&&.);
template<class R, class Visitor, class. Variants>
constexpr R visit(Visitor&&, Variants&&.);
struct monostate;
constexpr bool operator=(monostate, monostate) noexcept;
constexpr strong_ordering operator<=>(monostate, monostate) noexcept;
template<class. Types>
constexpr void swap(variant<Types..>&, variant<Types..>&) noexcept(see below);
class bad_variant_access;
template<class T> struct hash;
template<class. Types> struct hash<variant<Types..>;
template<> struct hash<monostate>;
}