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는 "여러 타입 중 하나인 값"을 표현하는 타입 안전한 도구예요. 파싱 결과, 설정값, 이벤트 등에 유용해요.