Namespaces
Variants

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

From cppreference.net
Standard library headers

Этот заголовок является частью библиотеки общих утилит .

Содержание

Включения

(C++20)
Поддержка оператора трёхстороннего сравнения

Классы

(C++17)
типобезопасное размеченное объединение
(шаблон класса)
(C++17)
тип-заполнитель для использования в качестве первой альтернативы в variant для недефолтно-конструируемых типов
(класс)
исключение, выбрасываемое при недопустимых обращениях к значению variant
(класс)
получает размер списка альтернатив variant во время компиляции
(шаблон класса) (шаблон переменной)
получает тип альтернативы, указанной по её индексу, во время компиляции
(шаблон класса) (шаблон псевдонима)
поддержка хеширования для std::variant
(специализация шаблона класса)

Константы

индекс variant в невалидном состоянии
(константа)

Функции

(C++17)
вызывает предоставленный функтор с аргументами, содержащимися в одном или нескольких variant s
(шаблон функции)
проверяет, содержит ли variant в данный момент заданный тип
(шаблон функции)
читает значение варианта по заданному индексу или типу (если тип уникален), генерирует исключение при ошибке
(шаблон функции)
(C++17)
получает указатель на значение указанного variant по индексу или типу (если уникален), возвращает null при ошибке
(шаблон функции)
(C++17) (C++17) (C++17) (C++17) (C++17) (C++17) (C++20)
сравнивает variant объекты как их содержащиеся значения
(шаблон функции)
специализирует алгоритм std::swap
(шаблон функции)

Синопсис

// преимущественно независимая
#include <compare>
namespace std {
  // шаблон класса variant
  template<class... Типы> class variant;
  // вспомогательные классы для variant
  template<class T> struct variant_size;                  // не определено
  template<class T> struct variant_size<const T>;
  template<class T> constexpr size_t variant_size_v = variant_size<T>::значение;
  template<class... Типы> struct variant_size<variant<Types...>>;
  template<size_t I, class T> struct variant_alternative; // не определено
  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... Типы> struct variant_alternative<I, variant<Types...>>;
  inline constexpr size_t variant_npos = -1;
  // доступ к значению
  template<class T, class... Типы>
  constexpr bool holds_alternative(const variant<Types...>&) noexcept;
  template<size_t I, class... Типы>
  constexpr variant_alternative_t<I, variant<Types...>>& get(
    variant<Types...>&);                              // freestanding-deleted
  template<size_t I, class... Типы>
  constexpr variant_alternative_t<I, variant<Types...>>&& get(
    variant<Types...>&&);                             // freestanding-deleted
  template<size_t I, class... Типы>
  constexpr const variant_alternative_t<I, variant<Types...>>& get(
    const variant<Types...>&);                        // freestanding-deleted
  template<size_t I, class... Типы>
  constexpr const variant_alternative_t<I, variant<Types...>>&& get(
    const variant<Types...>&&);                       // freestanding-deleted
  template<class T, class... Типы>
  constexpr T& get(variant<Types...>&);               // freestanding-deleted
  template<class T, class... Типы>
  constexpr T&& get(variant<Types...>&&);             // freestanding-deleted
  template<class T, class... Типы>
  constexpr const T& get(const variant<Types...>&);   // freestanding-deleted
  template<class T, class... Типы>
  constexpr const T&& get(const variant<Types...>&&); // freestanding-deleted
  template<size_t I, class... Типы>
  constexpr add_pointer_t<variant_alternative_t<I, variant<Types...>>> get_if(
    variant<Types...>*) noexcept;
  template<size_t I, class... Типы>
  constexpr add_pointer_t<const variant_alternative_t<I, variant<Types...>>> get_if(
    const variant<Types...>*) noexcept;
  template<class T, class... Типы>
  constexpr add_pointer_t<T> get_if(variant<Types...>*) noexcept;
  template<class T, class... Типы>
  constexpr add_pointer_t<const T> get_if(const variant<Types...>*) noexcept;
  // операторы отношений
  template<class... Типы>
  constexpr bool operator==(const variant<Types...>&, const variant<Types...>&);
  template<class... Типы>
  constexpr bool operator!=(const variant<Types...>&, const variant<Types...>&);
  template<class... Типы>
  constexpr bool operator<(const variant<Types...>&, const variant<Types...>&);
  template<class... Типы>
  constexpr bool operator>(const variant<Types...>&, const variant<Types...>&);
  template<class... Типы>
  constexpr bool operator<=(const variant<Types...>&, const variant<Types...>&);
  template<class... Типы>
  constexpr bool operator>=(const variant<Types...>&, const variant<Types...>&);
  template<class... Типы>
    requires(three_way_comparable<Types> && ...)
  constexpr common_comparison_category_t<compare_three_way_result_t<Types>...>
  operator<=>(const variant<Types...>&, const variant<Types...>&);
  // посещение
  template<class Visitor, class... Варианты>
  constexpr /* см. описание */ visit(Visitor&&, Variants&&...);
  template<class R, class Visitor, class... Варианты>
  constexpr R visit(Visitor&&, Variants&&...);
  // класс monostate
  struct monostate;
  // моностатные операторы отношений
  constexpr bool operator==(monostate, monostate) noexcept;
  constexpr strong_ordering operator<=>(monostate, monostate) noexcept;
  // специализированные алгоритмы
  template<class... Типы>
  constexpr void swap(variant<Types...>&,
                      variant<Types...>&) noexcept(/* см. описание */);
  // class bad_variant_access
  class bad_variant_access;
  // поддержка хеширования
  template<class T> struct hash;
  template<class... Типы> struct hash<variant<Types...>>;
  template<> struct hash<monostate>;
}
// устаревший
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>;
}

Шаблон класса std::variant

namespace std {
  template<class... Types> class variant
  {
  public:
    // конструкторы
    constexpr variant() noexcept(/* см. описание */);
    constexpr variant(const variant&);
    constexpr variant(variant&&) noexcept(/* см. описание */);
    template<class T> constexpr variant(T&&) noexcept(/* см. описание */);
    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&&...);
    // деструктор
    constexpr ~variant();
    // присваивание
    constexpr variant& operator=(const variant&);
    constexpr variant& operator=(variant&&) noexcept(/* см. описание */);
    template<class T> constexpr variant& operator=(T&&) noexcept(/* см. описание */);
    // модификаторы
    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&&...);
    // состояние значения
    constexpr bool valueless_by_exception() const noexcept;
    constexpr size_t index() const noexcept;
    // обмен
    constexpr void swap(variant&) noexcept(/* см. описание */);
    // посещение
    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&&);
  };
}

Класс 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;
  }
}
**Примечание:** Весь код C++ внутри тегов `
` и `` оставлен без изменений, как и требовалось. HTML-теги и атрибуты также сохранены в оригинальном виде.

Класс std::bad_variant_access

namespace std {
  class bad_variant_access : public exception
  {
  public:
    // см. описание для спецификации специальных функций-членов
    constexpr const char* what() const noexcept override;
  };
}