variant_variant_size
variant_variant_size (variant의 대안 개수 조회)
이 페이지에서는 std::variant_size에 대해 알아볼게요. std::variant_size는 cv 한정자가 붙을 수 있는 std::variant 타입에 포함된 대안(alternative)의 개수를 컴파일 타임 상수 표현식으로 제공하는 클래스 템플릿이에요. 이 값을 통해 std::variant에 몇 개의 대안이 있는지 컴파일 타임에 확인할 수 있어요.
출처: cppreference
본문
std::variant_size는 <variant> 헤더에 정의되어 있으며, cv 한정된 variant의 대안 개수를 컴파일 타임 상수 표현식으로 접근할 수 있게 해줘요. 공식적으로는 다음과 같이 정의돼요.
정의
<variant> 헤더에 정의됨 |
||
|---|---|---|
template < class T > struct variant_size ; /* undefined */ |
(1) | (C++17 이후) |
template < class ... Types > struct variant_size < std :: variant < Types ... >> : std :: integral_constant < std :: size_t , sizeof ...( Types ) > {}; |
(2) | (C++17 이후) |
template < class T > class variant_size < const T > ; |
(3) | (C++17 이후) |
template < class T > class variant_size < volatile T > ; |
(4) | (C++17 이후) (C++20에서 폐기 예정) |
template < class T > class variant_size < const volatile T > ; |
(5) | (C++17 이후) (C++20에서 폐기 예정) |
(1)은 기본 템플릿으로, 정의되지 않은 상태로 남아 있어요. (2)가 실제 std::variant 특수화에 대해 sizeof...(Types) 값을 std::integral_constant로 노출해요. (3), (4), (5)는 각각 const, volatile, const volatile 한정자가 붙은 variant에 대한 특수화예요.
헬퍼 변수 템플릿
| 템플릿 정의 | ||
|---|---|---|
template < class T > constexpr std :: size_t variant_size_v = std :: variant_size < T >:: value ; |
(C++17 이후) |
variant_size_v를 사용하면 ::value를 직접 쓰지 않고도 더 간결하게 대안 개수를 얻을 수 있어요.
std::integral_constant에서 상속
std::variant_size의 특수화는 std::integral_constant<std::size_t, N>에서 상속받아요. 따라서 아래와 같은 멤버들을 사용할 수 있어요.
멤버 상수
| 이름 | 설명 |
|---|---|
value [static] |
sizeof...(Types) (공용 정적 멤버 상수) |
멤버 함수
| 이름 | 설명 |
|---|---|
operator std::size_t |
객체를 std::size_t로 변환하며 value를 반환해요 (공용 멤버 함수) |
operator() (C++14) |
value를 반환해요 (공용 멤버 함수) |
멤버 타입
| 타입 | 정의 |
|---|---|
value_type |
std::size_t |
type |
std::integral_constant<std::size_t, value> |
참고 사항
std::variant_size의 모든 특수화는 어떤 N에 대해 기본 특성 std::integral_constant<std::size_t, N>을 가지는 UnaryTypeTrait 요구 사항을 만족해요.
예제
#include <any>
#include <variant>
static_assert(std::variant_size_v<std::variant<>> == 0);
static_assert(std::variant_size_v<std::variant<int>> == 1);
static_assert(std::variant_size_v<std::variant<int, int>> == 2);
static_assert(std::variant_size_v<std::variant<int, int, int>> == 3);
static_assert(std::variant_size_v<std::variant<int, float, double>> == 3);
static_assert(std::variant_size_v<std::variant<std::monostate, void>> == 2);
static_assert(std::variant_size_v<std::variant<const int, const float>> == 2);
static_assert(std::variant_size_v<std::variant<std::variant<std::any>>> == 1);
int main() {}
위 예제는 static_assert를 사용해 다양한 std::variant 타입의 대안 개수를 컴파일 타임에 검증해요. 빈 variant는 0개, 단일 타입은 1개, 여러 타입은 그 개수만큼 값을 가지는 걸 확인할 수 있어요.
같이 보기
| 문서 | 설명 |
|---|---|
variant (C++17) |
타입 안전한 구분 합집합 (클래스 템플릿) |
variant_alternative, variant_alternative_t (C++17) |
인덱스로 지정된 대안의 타입을 컴파일 타임에 얻어요 (클래스 템플릿, 별칭 템플릿) |
std::tuple_size<std::tuple> (C++11) |
튜플의 크기를 얻어요 (클래스 템플릿 특수화) |
variant_size (C++26) |
반영된 variant의 대안 목록 크기를 반환해요 (함수) |