Standard library header <variant> (C++17)
From cppreference.net
このヘッダは 汎用ユーティリティ ライブラリの一部です。
Includes |
||
|
(C++20)
|
三方比較演算子 サポート | |
クラス |
||
|
(C++17)
|
型安全な判別共用体
(クラステンプレート) |
|
|
(C++17)
|
非デフォルト構築可能な型の
variant
の最初の代替型として使用するためのプレースホルダ型
(クラス) |
|
|
(C++17)
|
variantの値への不正なアクセス時にスローされる例外
variant
(クラス) |
|
|
(C++17)
|
コンパイル時に
variant
の代替型リストのサイズを取得する
(クラステンプレート) (変数テンプレート) |
|
|
指定されたインデックスの代替型をコンパイル時に取得する
(クラステンプレート) (エイリアステンプレート) |
||
|
(C++17)
|
std::variant
のハッシュサポート
(クラステンプレートの特殊化) |
|
定数 |
||
|
(C++17)
|
無効状態の
variant
のインデックス
(定数) |
|
関数 |
||
|
(C++17)
|
1つ以上の
variant
が保持する引数で提供されたファンクタを呼び出す
(関数テンプレート) |
|
|
(C++17)
|
variant
が現在指定された型を保持しているかどうかをチェックする
(関数テンプレート) |
|
|
(C++17)
|
インデックスまたは型(型が一意の場合)を指定してvariantの値を読み取り、エラー時には例外をスローする
(関数テンプレート) |
|
|
(C++17)
|
指定されたインデックスまたは型(一意の場合)に基づいて、指し示された
variant
の値へのポインタを取得し、エラー時にはnullを返す
(関数テンプレート) |
|
|
(C++17)
(C++17)
(C++17)
(C++17)
(C++17)
(C++17)
(C++20)
|
variant
オブジェクトをその保持する値として比較する
(関数テンプレート) |
|
|
(C++17)
|
std::swap
アルゴリズムを特殊化
(関数テンプレート) |
|
概要
// 大部分はフリースタンディング #include <compare> namespace std { // クラステンプレート variant template<class... Types> 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>::value; template<class... Types> 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... Types> struct variant_alternative<I, variant<Types...>>; inline constexpr size_t variant_npos = -1; // 値アクセス 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; // 関係演算子 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...>&); // ビジテーション template<class Visitor, class... Variants> constexpr /* 詳細は説明を参照 */ 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; // 特殊化アルゴリズム 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... Types> 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; } }
クラス std::bad_variant_access
namespace std { class bad_variant_access : public exception { public: // 特殊メンバ関数の仕様については説明を参照 constexpr const char* what() const noexcept override; }; }