Namespaces
Variants

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

From cppreference.net
Standard library headers

Este encabezado es parte de la biblioteca de utilidades generales .

Contenidos

Includes

(C++20)
Soporte para operador de comparación de tres vías

Clases

(C++17)
una unión discriminada type-safe
(plantilla de clase)
(C++17)
tipo de marcador de posición para usar como la primera alternativa en un variant de tipos no construibles por defecto
(clase)
excepción lanzada en accesos inválidos al valor de un variant
(clase)
obtiene el tamaño de la lista de alternativas del variant en tiempo de compilación
(plantilla de clase) (plantilla de variable)
obtiene el tipo de la alternativa especificada por su índice, en tiempo de compilación
(plantilla de clase) (plantilla de alias)
soporte de hash para std::variant
(especialización de plantilla de clase)

Constantes

índice del variant en el estado no válido
(constante)

Funciones

(C++17)
llama al funtor proporcionado con los argumentos contenidos en una o más variant s
(plantilla de función)
comprueba si un variant actualmente contiene un tipo dado
(plantilla de función)
lee el valor del variant dado el índice o el tipo (si el tipo es único), lanza una excepción en caso de error
(plantilla de función)
(C++17)
obtiene un puntero al valor de un variant apuntado dado el índice o el tipo (si es único), retorna null en caso de error
(plantilla de función)
(C++17) (C++17) (C++17) (C++17) (C++17) (C++17) (C++20)
compara objetos variant como sus valores contenidos
(plantilla de función)
especializa el algoritmo std::swap
(plantilla de función)

Sinopsis

// mayormente independiente
#include <compare>
namespace std {
  // plantilla de clase variant
  template<class... Types> class variant;
  // clases auxiliares de variant
  template<class T> struct variant_size;                  // no definido
  template<class T> struct variant_size<const T>;
  template<class T> constexpr size_t variant_size_v = variant_size<T>::valor;
  template<class... Tipos> struct variant_size<variant<Types...>>;
  template<size_t I, class T> struct variant_alternative; // no definido
  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... Tipos> struct variant_alternative<I, variant<Types...>>;
  inline constexpr size_t variant_npos = -1;
  // acceso a valores
  template<class T, class... Tipos>
  constexpr bool holds_alternative(const variant<Types...>&) noexcept;
  template<size_t I, class... Tipos>
  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... Tipos>
  constexpr const T& get(const variant<Types...>&);   // freestanding-deleted
  template<class T, class... Tipos>
  constexpr const T&& get(const variant<Types...>&&); // freestanding-deleted
  template<size_t I, class... Tipos>
  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... Tipos>
  constexpr add_pointer_t<T> get_if(variant<Types...>*) noexcept;
  template<class T, class... Tipos>
  constexpr add_pointer_t<const T> get_if(const variant<Types...>*) noexcept;
  // operadores relacionales
  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... Tipos>
  constexpr bool operator>(const variant<Types...>&, const variant<Types...>&);
  template<class... Tipos>
  constexpr bool operator<=(const variant<Types...>&, const variant<Types...>&);
  template<class... Tipos>
  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... Variantes>
  constexpr /* ver descripción */ visit(Visitor&&, Variants&&...);
  template<class R, class Visitor, class... Variantes>
  constexpr R visit(Visitor&&, Variants&&...);
  // class monostate
  struct monostate;
  // operadores relacionales monostate
  constexpr bool operator==(monostate, monostate) noexcept;
  constexpr strong_ordering operator<=>(monostate, monostate) noexcept;
  // algoritmos especializados
  template<class... Types>
  constexpr void swap(variant<Types...>&,
                      variant<Types...>&) noexcept(/* ver descripción */);
  // class bad_variant_access
  class bad_variant_access;
  // soporte para hash
  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>;
}

Plantilla de clase std::variant

namespace std {
  template<class... Types> class variant
  {
  public:
    // constructores
    constexpr variant() noexcept(/* ver descripción */);
    constexpr variant(const variant&);
    constexpr variant(variant&&) noexcept(/* ver descripción */);
    template<class T> constexpr variant(T&&) noexcept(/* ver descripción */);
    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();
    // asignación
    constexpr variant& operator=(const variant&);
    constexpr variant& operator=(variant&&) noexcept(/* ver descripción */);
    template<class T> constexpr variant& operator=(T&&) noexcept(/* ver descripción */);
    // modificadores
    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&&...);
    // estado del valor
    constexpr bool valueless_by_exception() const noexcept;
    constexpr size_t index() const noexcept;
    // intercambio
    constexpr void swap(variant&) noexcept(/* ver descripción */);
    // visita
    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&&);
  };
}

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

Clase std::bad_variant_access

namespace std {
  class bad_variant_access : public exception
  {
  public:
    // ver descripción para la especificación de las funciones miembro especiales
    constexpr const char* what() const noexcept override;
  };
}