기본 패턴
cpp
std::variant<int, std::string> value = std::string("hello");
std::visit([](const auto& item) {
std::cout << item << "\n";
}, value);설명
std::variant는 "여러 타입 중 정확히 하나를 담는 값"을 타입 안전하게 표현하는 도구입니다. 전통적인union보다 훨씬 안전하고 사용 의도도 더 분명합니다.- 예를 들어 파싱 결과가 숫자일 수도 문자열일 수도 있다면,
variant<int, std::string>처럼 가능한 경우의 수를 타입 수준에서 명시할 수 있습니다. std::visit은 현재 담긴 타입에 맞는 동작을 수행하게 해 줍니다. 즉 runtime 상태를 안전하게 분기하면서도, 컴파일러가 가능한 타입 집합을 알고 있도록 유지합니다.- 이 패턴은 "서로 다른 경우의 수를 한 값으로 표현하되, 억지 형변환은 피하고 싶다"는 문제에서 특히 강합니다. 현대 C++의 algebraic data type에 가까운 감각이라고 볼 수 있습니다.
- 중요한 것은 문법 자체보다 모델링입니다. 어떤 경우의 수가 가능한지 미리 닫힌 집합으로 정의할 수 있다면
variant가 class hierarchy보다 더 간단하고 명확할 때도 많습니다.
빠른 정리
| 요소 | 의미 |
|---|---|
std::variant<A, B> | A 또는 B 중 하나를 담는 값 |
std::visit | 현재 타입에 맞는 동작 분기 |
| 장점 | 타입 안전한 다중 경우 표현 |
| 잘 맞는 곳 | 파서 결과, 상태 값, 닫힌 경우의 수 |
주의할 점
variant는 경우의 수가 닫혀 있을 때 특히 잘 맞습니다. 반대로 새로운 타입 확장이 자주 필요한 열린 구조라면
상속 계층이 더 자연스러울 수도 있습니다.
참고 링크
2 sources