std::variant_alternative, std::variant_alternative_t
ja.cppreference.net より
| ヘッダ <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 修飾を組み合わせます。
形式的には、
の選択肢の型と等しくなります。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 | 範囲外インデックスは未定義動作を引き起こした | 不正形式として扱う |
関連項目
|
(C++17)
|
コンパイル時に
variant
の代替型リストのサイズを取得する
(クラステンプレート) (変数テンプレート) |
|
(C++11)
|
指定された要素の型を取得する
(クラステンプレート特殊化) |