Namespaces
Variants
Actions

Standard library header <variant> (C++17)

From cppreference.com
< cpp‎ | header
 
 
Standard library headers
<any> (C++17)
<bit> (C++20)
<charconv> (C++17)
<expected> (C++23)
<format> (C++20)
<optional> (C++17)
<stdbit.h> (C++26)
<tuple> (C++11)
<typeindex> (C++11)
<variant> (C++17)
<array> (C++11)
<flat_map> (C++23)
<flat_set> (C++23)
<hive> (C++26)
<inplace_vector> (C++26)   
<mdspan> (C++23)
<span> (C++20)
<generator> (C++23)
<ranges> (C++20)
 

This header is part of the general utility library.

Classes

(C++17)
a type-safe discriminated union
(class template) [edit]
(C++17)
placeholder type for use as the first alternative in a variant of non-default-constructible types
(class) [edit]
exception thrown on invalid accesses to the value of a variant
(class) [edit]
obtains the size of the variant's list of alternatives at compile time
(class template) (variable template)[edit]
obtains the type of the alternative specified by its index, at compile time
(class template) (alias template)[edit]
hash support for std::variant
(class template specialization) [edit]

Constants

index of the variant in the invalid state
(constant) [edit]

Functions

(C++17)
calls the provided functor with the arguments held by one or more variants
(function template) [edit]
checks if a variant currently holds a given type
(function template) [edit]
reads the value of the variant given the index or the type (if the type is unique), throws on error
(function template) [edit]
(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) [edit]
(C++17)(C++17)(C++17)(C++17)(C++17)(C++17)(C++20)
compares variant objects as their contained values
(function template) [edit]
specializes the std::swap algorithm
(function template) [edit]

[edit] Synopsis

// mostly freestanding
#include <compare>
 
namespace std {
 // class template variant
 template<class... Types> class variant;
 
 // variant helper classes
 template<class T> struct variant_size; // not defined
 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; // not defined
 template<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...>>;
 
 inline constexpr size_t variant_npos = -1;
 
 // value access
 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...>&); // freestanding-deleted
 template<size_t I, class... Types>
 constexpr variant_alternative_t<I, variant<Types...>>&& get(
 variant<Types...>&&); // freestanding-deleted
 template<size_t I, class... Types>
 constexpr const variant_alternative_t<I, variant<Types...>>& get(
 const variant<Types...>&); // freestanding-deleted
 template<size_t I, class... Types>
 constexpr const variant_alternative_t<I, variant<Types...>>&& get(
 const variant<Types...>&&); // freestanding-deleted
 
 template<class T, class... Types>
 constexpr T& get(variant<Types...>&); // freestanding-deleted
 template<class T, class... Types>
 constexpr T&& get(variant<Types...>&&); // freestanding-deleted
 template<class T, class... Types>
 constexpr const T& get(const variant<Types...>&); // freestanding-deleted
 template<class T, class... Types>
 constexpr const T&& get(const variant<Types...>&&); // freestanding-deleted
 
 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 operators
 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...>&);
 
 // visitation
 template<class Visitor, class... Variants>
 constexpr /* see description */ visit(Visitor&&, Variants&&...);
 template<class R, class Visitor, class... Variants>
 constexpr R visit(Visitor&&, Variants&&...);
 
 // class monostate
 struct monostate;
 
 // monostate relational operators
 constexpr bool operator==(monostate, monostate) noexcept;
 constexpr strong_ordering operator<=>(monostate, monostate) noexcept;
 
 // specialized algorithms
 template<class... Types>
 constexpr void swap(variant<Types...>&,
 variant<Types...>&) noexcept(/* see description */);
 
 // class bad_variant_access
 class bad_variant_access;
 
 // hash support
 template<class T> struct hash;
 template<class... Types> struct hash<variant<Types...>>;
 template<> struct hash<monostate>;
}
 
// deprecated
namespace std {
 template<class T> struct variant_size<volatile T>;
 template<class T> struct variant_size<const volatile T>;
 
 template<size_t I, class T> struct variant_alternative<I, volatile T>;
 template<size_t I, class T> struct variant_alternative<I, const volatile T>;
}

[edit] Class template std::variant

namespace std {
 template<class... Types> class variant
 {
 public:
 // constructors
 constexpr 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>
 constexpr explicit variant(in_place_type_t<T>, Args&&...);
 template<class T, class U, class... Args>
 constexpr explicit variant(in_place_type_t<T>, initializer_list<U>, Args&&...);
 
 template<size_t I, class... Args>
 constexpr explicit variant(in_place_index_t<I>, Args&&...);
 template<size_t I, class U, class... Args>
 constexpr explicit variant(in_place_index_t<I>, initializer_list<U>, Args&&...);
 
 // destructor
 constexpr ~variant();
 
 // assignment
 constexpr variant& operator=(const variant&);
 constexpr variant& operator=(variant&&) noexcept(/* see description */);
 
 template<class T> constexpr variant& operator=(T&&) noexcept(/* see description */);
 
 // modifiers
 template<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 status
 constexpr bool valueless_by_exception() const noexcept;
 constexpr size_t index() const noexcept;
 
 // swap
 constexpr void swap(variant&) noexcept(/* see description */);
 
 // visitation
 template<class Self, class Visitor>
 constexpr decltype(auto) visit(this Self&&, Visitor&&);
 template<class R, class Self, class Visitor>
 constexpr R visit(this Self&&, Visitor&&);
 };
}

[edit] Class std::monostate

namespace std {
 struct monostate{};
 
 constexpr bool
 operator==(monostate, monostate) noexcept { return true; }
 
 constexpr strong_ordering
 operator<=>(monostate, monostate) noexcept
 {
 return strong_ordering::equal;
 }
}

[edit] Class std::bad_variant_access

namespace std {
 class bad_variant_access : public exception
 {
 public:
 // see description for the specification of the special member functions
 constexpr const char* what() const noexcept override;
 };
}
Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/header/variant&oldid=178525"

AltStyle によって変換されたページ (->オリジナル) /