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 요구 사항을 충족하며, 멤버 typedef 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 variant의 I 번째 alternative의 타입. I 는 반드시 [0, sizeof...(Types)) 범위 내에 있어야 하며, 그렇지 않을 경우 프로그램은 ill-formed입니다.

헬퍼 템플릿 별칭

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>>);
// variant 타입의 cv 한정자는 추출된 대체 타입으로 전파됩니다.
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 의 대안 목록 크기를 구함
(클래스 템플릿) (변수 템플릿)
지정된 요소의 타입을 구함
(클래스 템플릿 특수화)