名前空間
変種
操作

std::variant_alternative, std::variant_alternative_t

From cppreference.com
< cpp‎ | utility‎ | variant
 
 
ユーティリティライブラリ
言語サポート
型のサポート (基本型、RTTI)
ライブラリ機能検査マクロ (C++20)
プログラムユーティリティ
可変引数関数
コルーチンサポート (C++20)
契約サポート (C++26)
三方比較
(C++20)
(C++20)(C++20)(C++20)  
(C++20)(C++20)(C++20)

汎用ユーティリティ
関係演算子 (C++20で非推奨)
 
 
ヘッダ <variant> で定義
template <std::size_t I, class T>
struct variant_alternative; /* 未定義 */
(1) (C++17以降)
template <std::size_t I, class... Types>
struct variant_alternative<I, variant<Types...>>;
(2) (C++17以降)
template <std::size_t I, class T> class variant_alternative<I, const T>;
(3) (C++17以降)
template <std::size_t I, class T>

class variant_alternative<I, volatile T>;
template <std::size_t I, class T>

class variant_alternative<I, const volatile T>;
(3) (C++17以降)
(C++20で非推奨)

cv修飾された可能性のあるvariantの代替型にコンパイル時にインデックスでアクセスを提供し、variantのcv修飾子(もしあれば)と代替型のcv修飾子を組み合わせます。

正式には、

2) TransformationTraitの要件を満たし、メンバ型エイリアスtypeはインデックスIの代替型の型と等しくなります。
3) TransformationTraitの要件を満たし、メンバ型エイリアスtypeは、それぞれstd::add_const_t<std::variant_alternative_t<I,T>>std::add_volatile_t<std::variant_alternative_t<I,T>>、およびstd::add_cv_t<std::variant_alternative_t<I,T>>を指します。

目次

[編集] メンバ型

メンバ型 定義
type variantのI番目の代替型の型。ここでI[0, sizeof...(Types))の範囲内にある必要があります。それ以外の場合はプログラムは不正形式です。

[編集] ヘルパーテンプレートエイリアス

template <size_t I, class T>
using variant_alternative_t = typename variant_alternative<I, T>::type;
(C++17以降)

[編集]

#include <variant>
#include <iostream>
 
using my_variant = std::variant<int, float>;
static_assert(std::is_same_v
    <int,   std::variant_alternative_t<0, my_variant>>);
static_assert(std::is_same_v
    <float, std::variant_alternative_t<1, my_variant>>);
// cv-qualification on the variant type propagates to the extracted alternative type.
static_assert(std::is_same_v
    <const int, std::variant_alternative_t<0, const my_variant>>);
 
int main()
{
    std::cout << "All static assertions passed.\n";
}

出力

All static assertions passed.

[編集] 不具合報告

以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。

DR 適用対象 公開された動作 正しい動作
LWG 2974 C++17 範囲外のインデックスは未定義の動作を引き起こしました。 ill-formed にした

[編集] 関連項目

コンパイル時に variant の代替型のリストのサイズを取得する
(class template) (variable template)[編集]
指定された要素の型を取得する
(クラステンプレート特殊化) [編集]
English 日本語 中文(简体) 中文(繁體)