Standard library header <variant> (C++17)
From cppreference.com
This header is part of the general utility library.
Includes | ||
(C++20) | Three-way comparison operator support | |
Classes | ||
(C++17) | a type-safe discriminated union (class template) | |
(C++17) | placeholder type for use as the first alternative in a variant of non-default-constructible types (class) | |
(C++17) | exception thrown on invalid accesses to the value of a variant (class) | |
(C++17) | obtains the size of the variant 's list of alternatives at compile time(class template)(variable template) | |
obtains the type of the alternative specified by its index, at compile time (class template)(alias template) | ||
(C++17) | hash support for std::variant (class template specialization) | |
Constants | ||
(C++17) | index of the variant in the invalid state (constant) | |
Functions | ||
(C++17) | calls the provided functor with the arguments held by one or more variant s (function template) | |
(C++17) | checks if a variant currently holds a given type (function template) | |
(C++17) | reads the value of the variant given the index or the type (if the type is unique), throws on error (function template) | |
(C++17) | obtains a pointer to the value of a pointed-to variant given the index or the type (if unique), returns null on error (function template) | |
(C++17)(C++17)(C++17)(C++17)(C++17)(C++17)(C++20) | compares variant objects as their contained values (function template) | |
(C++17) | specializes the std::swap algorithm (function template) |
[edit]Synopsis
#include <compare> namespace std {// class template varianttemplate<class... Types>class variant; // variant helper classestemplate<class T>struct variant_size;// not definedtemplate<class T>struct variant_size<const T>;template<class T>inlineconstexpr 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;// not definedtemplate<size_t I, class T>struct variant_alternative<I, const T>;template<size_t I, class T>using variant_alternative_t =typename variant_alternative<I, T>::type; template<size_t I, class... Types>struct variant_alternative<I, variant<Types...>>; inlineconstexpr size_t variant_npos =-1; // value accesstemplate<class T, class... Types>constexprbool 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>constexprconst variant_alternative_t<I, variant<Types...>>& get(const variant<Types...>&);template<size_t I, class... Types>constexprconst 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>constexprconst T& get(const variant<Types...>&);template<class T, class... Types>constexprconst 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; // relational operatorstemplate<class... Types>constexprbool operator==(const variant<Types...>&, const variant<Types...>&);template<class... Types>constexprbool operator!=(const variant<Types...>&, const variant<Types...>&);template<class... Types>constexprbool operator<(const variant<Types...>&, const variant<Types...>&);template<class... Types>constexprbool operator>(const variant<Types...>&, const variant<Types...>&);template<class... Types>constexprbool operator<=(const variant<Types...>&, const variant<Types...>&);template<class... Types>constexprbool 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...>&); // visitationtemplate<class Visitor, class... Variants>constexpr/* see description */ visit(Visitor&&, Variants&&...);template<class R, class Visitor, class... Variants>constexpr R visit(Visitor&&, Variants&&...); // class monostatestruct monostate; // monostate relational operatorsconstexprbool operator==(monostate, monostate)noexcept;constexpr strong_ordering operator<=>(monostate, monostate)noexcept; // specialized algorithmstemplate<class... Types>constexprvoid swap(variant<Types...>&, variant<Types...>&)noexcept(/* see description */); // class bad_variant_accessclass bad_variant_access; // hash supporttemplate<class T>struct hash;template<class... Types>struct hash<variant<Types...>>;template<>struct hash<monostate>;} // deprecatednamespace std {template<class T>struct variant_size<volatile T>;template<class T>struct variant_size<constvolatile T>; template<size_t I, class T>struct variant_alternative<I, volatile T>;template<size_t I, class T>struct variant_alternative<I, constvolatile T>;}
[edit]Class template std::variant
namespace std {template<class... Types>class variant {public:// constructorsconstexpr variant()noexcept(/* see description */);constexpr variant(const variant&);constexpr variant(variant&&)noexcept(/* see description */); template<class T>constexpr variant(T&&)noexcept(/* see description */); template<class T, class... Args>constexprexplicit variant(in_place_type_t<T>, Args&&...);template<class T, class U, class... Args>constexprexplicit variant(in_place_type_t<T>, initializer_list<U>, Args&&...); template<size_t I, class... Args>constexprexplicit variant(in_place_index_t<I>, Args&&...);template<size_t I, class U, class... Args>constexprexplicit variant(in_place_index_t<I>, initializer_list<U>, Args&&...); // destructorconstexpr ~variant(); // assignmentconstexpr variant& operator=(const variant&);constexpr variant& operator=(variant&&)noexcept(/* see description */); template<class T>constexpr variant& operator=(T&&)noexcept(/* see description */); // modifierstemplate<class T, class... Args>constexpr T& emplace(Args&&...);template<class T, class U, class... Args>constexpr T& emplace(initializer_list<U>, Args&&...);template<size_t I, class... Args>constexpr variant_alternative_t<I, variant<Types...>>& emplace(Args&&...);template<size_t I, class U, class... Args>constexpr variant_alternative_t<I, variant<Types...>>& emplace(initializer_list<U>, Args&&...); // value statusconstexprbool valueless_by_exception()constnoexcept;constexpr size_t index()constnoexcept; // swapconstexprvoid swap(variant&)noexcept(/* see description */);};}
[edit]Class std::monostate
struct monostate{};
[edit]Class std::bad_variant_access
class bad_variant_access :public exception {public:// see [exception] for the specification of the special member functionsconstchar* what()constnoexcept override;};