Namespaces
Variants

std:: variant_alternative, std:: variant_alternative_t

From cppreference.net
Utilities library
ヘッダーで定義 <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 の要件を満たし、メンバーtypedef 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 の代替型リストのサイズを取得する
(クラステンプレート) (変数テンプレート)
指定された要素の型を取得する
(クラステンプレート特殊化)