Namespaces
Variants

std::variant_alternative, std::variant_alternative_t

ja.cppreference.net より
 
 
ユーティリティライブラリ
言語サポート
型サポート (基本型、RTTI)
ライブラリ機能テストマクロ (C++20)
プログラムユーティリティ
可変個引数関数
コルーチンサポート (C++20)
契約サポート (C++26)
三方比較
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

汎用ユーティリティ
関係演算子 (C++20で非推奨)
整数比較関数
(C++20)(C++20)(C++20)    
(C++20)
swap および 型操作
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
共通語彙型
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)



 
 
ヘッダ <variant>
template <std::size_t I, class T>
struct variant_alternative; /* undefined */
で定義 (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 バリアントの 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 範囲外インデックスは未定義動作を引き起こした 不正形式として扱う

関連項目

コンパイル時に variant の代替型リストのサイズを取得する
(クラステンプレート) (変数テンプレート)
指定された要素の型を取得する
(クラステンプレート特殊化)