Namespaces
Variants

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

From cppreference.net
Standard library headers

Cet en-tête fait partie de la bibliothèque d'utilitaires généraux .

Table des matières

Inclusions

(C++20)
Opérateur de comparaison à trois voies support

Classes

(C++17)
une union discriminée type-safe
(modèle de classe)
(C++17)
type de substitution à utiliser comme première alternative dans un variant de types non constructibles par défaut
(classe)
exception levée lors d'accès invalides à la valeur d'un variant
(classe)
obtient la taille de la liste d'alternatives de la variant au moment de la compilation
(modèle de classe) (modèle de variable)
obtient le type de l'alternative spécifiée par son index, au moment de la compilation
(modèle de classe) (modèle d'alias)
Prise en charge du hachage pour std::variant
(spécialisation de modèle de classe)

Constantes

index du variant dans l'état invalide
(constante)

Fonctions

(C++17)
appelle le foncteur fourni avec les arguments contenus dans un ou plusieurs variant s
(modèle de fonction)
vérifie si un variant contient actuellement un type donné
(modèle de fonction)
lit la valeur du variant en fonction de l'index ou du type (si le type est unique), lance une exception en cas d'erreur
(modèle de fonction)
(C++17)
obtient un pointeur vers la valeur d'un variant pointé en fonction de l'index ou du type (s'il est unique), retourne null en cas d'erreur
(modèle de fonction)
(C++17) (C++17) (C++17) (C++17) (C++17) (C++17) (C++20)
compare les objets variant selon leurs valeurs contenues
(modèle de fonction)
spécialise l'algorithme std::swap
(modèle de fonction)

Synopsis

// principalement autonome
#include <compare>
namespace std {
  // modèle de classe variant
  template<class... Types> class variant;
  // classes d'assistance variant
  template<class T> struct variant_size;                  // non défini
  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; // non défini
  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;
  // accès aux valeurs
  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;
  // opérateurs relationnels
  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...>&);
  // visite
  template<class Visitor, class... Variantes>
  constexpr /* voir description */ visit(Visitor&&, Variants&&...);
  template<class R, class Visitor, class... Variantes>
  constexpr R visit(Visitor&&, Variants&&...);
  // classe monostate
  struct monostate;
  // opérateurs relationnels monostate
  constexpr bool operator==(monostate, monostate) noexcept;
  constexpr strong_ordering operator<=>(monostate, monostate) noexcept;
  // algorithmes spécialisés
  template<class... Types>
  constexpr void swap(variant<Types...>&,
                      variant<Types...>&) noexcept(/* voir description */);
  // classe bad_variant_access
  class bad_variant_access;
  // prise en charge du hachage
  template<class T> struct hash;
  template<class... Types> struct hash<variant<Types...>>;
  template<> struct hash<monostate>;
}
// obsolète
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>;
}

Modèle de classe std::variant

namespace std {
  template<class... Types> class variant
  {
  public:
    // constructeurs
    constexpr variant() noexcept(/* voir description */);
    constexpr variant(const variant&);
    constexpr variant(variant&&) noexcept(/* voir description */);
    template<class T> constexpr variant(T&&) noexcept(/* voir 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&&...);
    // destructeur
    constexpr ~variant();
    // affectation
    constexpr variant& operator=(const variant&);
    constexpr variant& operator=(variant&&) noexcept(/* voir description */);
    template<class T> constexpr variant& operator=(T&&) noexcept(/* voir description */);
    // modificateurs
    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&&...);
    // statut de la valeur
    constexpr bool valueless_by_exception() const noexcept;
    constexpr size_t index() const noexcept;
    // échange
    constexpr void swap(variant&) noexcept(/* voir description */);
    // visite
    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&&);
  };
}

Classe 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;
  }
}
**Note:** Le code C++ n'a pas été traduit car il se trouve dans des balises `
` et contient des termes spécifiques au C++ qui doivent être préservés selon les instructions. Seul le texte environnant aurait été traduit s'il y en avait eu.

Classe std::bad_variant_access

namespace std {
  class bad_variant_access : public exception
  {
  public:
    // voir la description pour la spécification des fonctions membres spéciales
    constexpr const char* what() const noexcept override;
  };
}