variant_variant_alternative

variant_variant_alternative (variant_alternative - variant의 대안 타입 컴파일 타임 접근)

std::variant_alternative는 컴파일 타임에 std::variant의 특정 인덱스에 해당하는 대안(alternative) 타입을 얻기 위한 클래스 템플릿이에요. cv 한정자가 붙은 variant에서도 cv 한정자를 적절히 결합하여 타입을 추출할 수 있답니다. 이 페이지에서는 이 템플릿의 정의, 멤버 타입, 헬퍼 별칭, 그리고 사용 예시를 살펴볼게요.

출처: cppreference

본문

<variant> 헤더에 정의된 이 템플릿은 C++17부터 사용할 수 있어요.

Defined in header <variant>
template < std::size_t I, class T > struct variant_alternative; /* undefined */ (1) (since C++17)
template < std::size_t I, class... Types > struct variant_alternative < I, variant < Types... >>; (2) (since C++17)
template < std::size_t I, class T > class variant_alternative < I, const T >; (3) (since C++17) (until C++20)
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 >; (since C++20) (deprecated in C++20)

이 템플릿은 cv 한정이 적용될 수 있는 variant의 대안 타입들에 대해 컴파일 타임 인덱스 접근을 제공해요. variant의 cv 한정(있다면)과 대안 타입의 cv 한정을 결합하여 결과 타입을 만들어내요.

형식적으로 말하면, variant_alternative<I, variant<Types...>>::type은 variant의 I번째 대안 타입이에요. I는 [0, sizeof...(Types)) 범위에 있어야 하며, 범위를 벗어나면 프로그램은 ill-formed가 돼요.

멤버 타입 (Member types)

멤버 타입 설명
type variant의 I번째 대안 타입. I는 [0, sizeof...(Types)) 범위에 있어야 하며, 그렇지 않으면 프로그램은 ill-formed예요.

헬퍼 템플릿 별칭 (Helper template alias)

template < size_t I, class T > using variant_alternative_t = typename variant_alternative < I, T >::type; (since C++17)

variant_alternative_t 별칭을 사용하면 typename variant_alternative<I, T>::type을 더 간결하게 쓸 수 있어요.

예제 (Example)

#include <variant>

using my_variant = std::variant<int, float>;

static_assert(
    std::is_same_v<int, std::variant_alternative_t<0, my_variant>> &&
    std::is_same_v<float, std::variant_alternative_t<1, my_variant>> &&
    // cv-qualification on the variant type propagates to the extracted alternative type
    std::is_same_v<const int, std::variant_alternative_t<0, const my_variant>>
);

int main() {}

이 예제에서는 my_variant의 0번째 대안 타입이 int, 1번째 대안 타입이 float인지 확인하고 있어요. 또한 const my_variant처럼 variant 자체에 cv 한정이 붙으면 추출된 대안 타입에도 const가 전파된다는 점을 보여주고 있어요.

결함 보고 (Defect reports)

다음의 동작 변경 결함 보고서는 이전에 발표된 C++ 표준에 소급 적용되었어요.

DR 적용 대상 발표 당시 동작 올바른 동작
LWG 2974 C++17 범위를 벗어난 인덱스는 undefined behavior를 유발함 ill-formed로 변경됨

같이 보기 (See also)

variant (C++17) 타입 안전한 구분 유니온 (클래스 템플릿)
variant_size, variant_size_v (C++17) 컴파일 타임에 variant의 대안 목록 크기를 얻음 (클래스 템플릿) (변수 템플릿)
std::tuple_element std::tuple (C++11) 지정된 요소의 타입을 얻음 (클래스 템플릿 특수화)
get (std::variant) (C++17) 인덱스 또는 타입으로 variant의 값을 읽음 (타입이 유일한 경우), 오류 시 예외 발생 (함수 템플릿)
variant_alternative (C++26) 반영된 튜플의 인덱스로 지정된 대안 타입을 얻음 (함수)

더 알아보기 (Learn more)

cppreference