variant — std::variant

variant — std::variant

std::variant 클래스 템플릿은 **타입 안전한 유니언(type-safe union)**을 나타내요. C++17에서 도입됐어요. <variant> 헤더에 있어요.

variant의 인스턴스는 어느 시점에든 후보 타입 중 하나의 값을 가져요.

출처: cppreference

본문

// <variant> 헤더, C++17
template< class... Types >
class variant;

사용 예

#include <variant>
#include <string>
#include <iostream>

std::variant<int, std::string, double> v;

v = 42;                    // 현재 int
v = std::string("hi");     // 현재 string
v = 3.14;                  // 현재 double

// 현재 타입 확인
std::cout << v.index() << '\n';   // 저장된 타입 인덱스 (여기선 2)

// 방문 (Visitor) — 현재 값에 맞는 동작
std::visit([](auto&& arg) {
    using T = std::decay_t<decltype(arg)>;
    if constexpr (std::is_same_v<T, int>) {
        std::cout << "int: " << arg << '\n';
    } else if constexpr (std::is_same_v<T, std::string>) {
        std::cout << "string: " << arg << '\n';
    }
}, v);   // double 3.14 출력

주요 연산

기능 설명
index() 활성 타입의 인덱스
get<I>(v) / get<T>(v) 특정 타입 접근 (틀리면 예외)
get_if 포인터 버전 (없으면 null)
holds_alternative<T>(v) 특정 타입인지
std::visit 현재 값에 함수 적용
emplace<I> 배치 생성
// 안전한 접근
if (auto p = std::get_if<std::string>(&v)) {
    std::cout << *p;   // string이면
} else {
    // string 아님
}

특징

  • 타입 안전 — 원시 유니언보다 안전하게 여러 타입 중 하나를 저장.
  • std::get 잘못된 타입 → std::bad_variant_access 예외.
  • std::visit로 현재 활성 타입에 따라 처리.

std::variant는 "여러 타입 중 하나인 값"을 표현하는 타입 안전한 도구예요. 파싱 결과, 설정값, 이벤트 등에 유용해요.

더 알아보기 (Learn more)

cppreference