Namespaces
Variants

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

From cppreference.net
Standard library headers

Dieser Header ist Teil der allgemeinen Utility-Bibliothek .

**Übersetzungsdetails:** - "Contents" → "Inhaltsverzeichnis" - "Classes" → "Klassen" - "Constants" → "Konstanten" - "Functions" → "Funktionen" - "Synopsis" → "Übersicht" - "Class template" → "Klassentemplate" - "Class" → "Klasse" - C++-spezifische Begriffe wie `std::variant`, `std::monostate`, `std::bad_variant_access` wurden nicht übersetzt - HTML-Tags und Attribute bleiben unverändert - "Includes" wurde nicht übersetzt, da es sich um einen C++-spezifischen Begriff handelt

Inhaltsverzeichnis

Includes

(C++20)
Unterstützung für den Drei-Wege-Vergleichsoperator

Klassen

(C++17)
eine typsichere diskriminierte Union
(Klassentemplate)
(C++17)
Platzhaltertyp für die Verwendung als erste Alternative in einem variant von nicht standardmäßig konstruierbaren Typen
(Klasse)
Exception, die bei ungültigen Zugriffen auf den Wert eines variant geworfen wird
(Klasse)
Ermittelt die Größe der Alternativliste des variant zur Kompilierzeit
(Klassentemplate) (Variablentemplate)
ermittelt den Typ der Alternative, die durch ihren Index angegeben wird, zur Kompilierzeit
(Klassentemplate) (Aliastemplate)
Hash-Unterstützung für std::variant
(Klassen-Template-Spezialisierung)

Konstanten

Index des variant im ungültigen Zustand
(Konstante)

Funktionen

(C++17)
ruft das bereitgestellte Funktionsobjekt mit den Argumenten auf, die von einem oder mehreren variant s gehalten werden
(Funktionstemplate)
prüft, ob ein variant derzeit einen gegebenen Typ enthält
(Funktions-Template)
liest den Wert des Varianten anhand des Index oder des Typs (falls der Typ eindeutig ist), wirft bei Fehler
(Funktions-Template)
(C++17)
erhält einen Zeiger auf den Wert eines gezeigten variant gegeben des Index oder des Typs (falls eindeutig), gibt bei Fehler null zurück
(Funktions-Template)
(C++17) (C++17) (C++17) (C++17) (C++17) (C++17) (C++20)
vergleicht variant -Objekte anhand ihrer enthaltenen Werte
(Funktionstemplate)
spezialisiert den std::swap Algorithmus
(Funktionsschablone)

Übersicht

// größtenteils freistehend
#include <compare>
namespace std {
  // Klassentemplate variant
  template<class... Typen> class variant;
  // Variant-Hilfsklassen
  template<class T> struct variant_size;                  // nicht definiert
  template<class T> struct variant_size<const T>;
  template<class T> constexpr size_t variant_size_v = variant_size<T>::Wert;
  template<class... Typen> struct variant_size<variant<Types...>>;
  template<size_t I, class T> struct variant_alternative; // nicht definiert
  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... Typen> struct variant_alternative<I, variant<Types...>>;
  inline constexpr size_t variant_npos = -1;
  // Wertzugriff
  template<class T, class... Typen>
  constexpr bool holds_alternative(const variant<Types...>&) noexcept;
  template<size_t I, class... Typen>
  constexpr variant_alternative_t<I, variant<Types...>>& get(
    variant<Types...>&);                              // freestanding-deleted
  template<size_t I, class... Typen>
  constexpr variant_alternative_t<I, variant<Types...>>&& get(
    variant<Types...>&&);                             // freestanding-deleted
  template<size_t I, class... Typen>
  constexpr const variant_alternative_t<I, variant<Types...>>& get(
    const variant<Types...>&);                        // freestanding-deleted
  template<size_t I, class... Typen>
  constexpr const variant_alternative_t<I, variant<Types...>>&& get(
    const variant<Types...>&&);                       // freestanding-deleted
  template<class T, class... Typen>
  constexpr T& get(variant<Types...>&);               // freestanding-deleted
  template<class T, class... Typen>
  constexpr T&& get(variant<Types...>&&);             // freestanding-deleted
  template<class T, class... Typen>
  constexpr const T& get(const variant<Types...>&);   // freestanding-deleted
  template<class T, class... Typen>
  constexpr const T&& get(const variant<Types...>&&); // freestanding-deleted
  template<size_t I, class... Typen>
  constexpr add_pointer_t<variant_alternative_t<I, variant<Types...>>> get_if(
    variant<Types...>*) noexcept;
  template<size_t I, class... Typen>
  constexpr add_pointer_t<const variant_alternative_t<I, variant<Types...>>> get_if(
    const variant<Types...>*) noexcept;
  template<class T, class... Typen>
  constexpr add_pointer_t<T> get_if(variant<Types...>*) noexcept;
  template<class T, class... Typen>
  constexpr add_pointer_t<const T> get_if(const variant<Types...>*) noexcept;
  // relational operators
  template<class... Typen>
  constexpr bool operator==(const variant<Types...>&, const variant<Types...>&);
  template<class... Typen>
  constexpr bool operator!=(const variant<Types...>&, const variant<Types...>&);
  template<class... Typen>
  constexpr bool operator<(const variant<Types...>&, const variant<Types...>&);
  template<class... Typen>
  constexpr bool operator>(const variant<Types...>&, const variant<Types...>&);
  template<class... Typen>
  constexpr bool operator<=(const variant<Types...>&, const variant<Types...>&);
  template<class... Typen>
  constexpr bool operator>=(const variant<Types...>&, const variant<Types...>&);
  template<class... Typen>
    requires(three_way_comparable<Types> && ...)
  constexpr common_comparison_category_t<compare_three_way_result_t<Types>...>
  operator<=>(const variant<Types...>&, const variant<Types...>&);
  // Besuch
  template<class Visitor, class... Varianten>
  constexpr /* siehe Beschreibung */ visit(Visitor&&, Variants&&...);
  template<class R, class Visitor, class... Varianten>
  constexpr R visit(Visitor&&, Variants&&...);
  // Klasse monostate
  struct monostate;
  // monostate relational operators
  constexpr bool operator==(monostate, monostate) noexcept;
  constexpr strong_ordering operator<=>(monostate, monostate) noexcept;
  // spezialisierte Algorithmen
  template<class... Typen>
  constexpr void swap(variant<Types...>&,
                      variant<Types...>&) noexcept(/* siehe Beschreibung */);
  // class bad_variant_access
  class bad_variant_access;
  // Hash-Unterstützung
  template<class T> struct hash;
  template<class... Typen> 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>;
}

Klassentemplate std::variant

namespace std {
  template<class... Types> class variant
  {
  public:
    // Konstruktoren
    constexpr variant() noexcept(/* siehe Beschreibung */);
    constexpr variant(const variant&);
    constexpr variant(variant&&) noexcept(/* siehe Beschreibung */);
    template<class T> constexpr variant(T&&) noexcept(/* siehe Beschreibung */);
    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&&...);
    // Destruktor
    constexpr ~variant();
    // Zuweisung
    constexpr variant& operator=(const variant&);
    constexpr variant& operator=(variant&&) noexcept(/* siehe Beschreibung */);
    template<class T> constexpr variant& operator=(T&&) noexcept(/* siehe Beschreibung */);
    // Modifikatoren
    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&&...);
    // Wertstatus
    constexpr bool valueless_by_exception() const noexcept;
    constexpr size_t index() const noexcept;
    // Austausch
    constexpr void swap(variant&) noexcept(/* siehe Beschreibung */);
    // Besuch
    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&&);
  };
}

Klasse 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;
  }
}

Klasse std::bad_variant_access

namespace std {
  class bad_variant_access : public exception
  {
  public:
    // siehe Beschreibung für die Spezifikation der speziellen Elementfunktionen
    constexpr const char* what() const noexcept override;
  };
}