std::variant là type-safe union — tại một thời điểm chỉ giữ một giá trị, nhưng luôn biết kiểu đang giữ là gì.
cpp
std::variant<int, double, std::string> v;
v = 42; // giữ int
v = 3.14; // giữ double
v = "hello"; // giữ string
// Truy cập:
std::cout << std::get<double>(v); // OK
// std::get<int>(v); // throw std::bad_variant_access
// Pattern matching:
std::visit([](auto&& val) {
std::cout << val;
}, v);Khác union:
union | std::variant | |
|---|---|---|
| Type tracking | Không | Có |
| Destructor | Không tự gọi | Tự gọi |
| An toàn | Không (UB nếu đọc sai kiểu) | An toàn |
Dùng khi: cần lưu một trong nhiều kiểu (kết quả parse, AST node, lỗi/giá trị).