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) | 반영된 튜플의 인덱스로 지정된 대안 타입을 얻음 (함수) |