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의 대안 목록 크기를 반환해요 (함수)

더 알아보기 (Learn more)

cppreference