std:: variant_alternative, std:: variant_alternative_t
|
ヘッダーで定義
<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
>
;
|
(3) |
(C++17以降)
(C++20で非推奨) |
おそらくCV修飾されたvariantの代替型へのコンパイル時インデックスアクセスを提供し、variantのCV修飾(存在する場合)と代替型のCV修飾を組み合わせます。
形式的には、
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)
|
指定された要素の型を取得する
(クラステンプレート特殊化) |