Mediumтипыvariant
Что такое std::any, std::optional и std::variant — и когда что применять?
1Постановка
Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.
2Решение
`std::optional<T>` — либо значение T, либо nothing (nullopt). `std::variant<T1,T2,...>` — sum type, хранит один из перечисленных типов. `std::any` — хранит значение любого типа, доступ через any_cast<T>.
// optional: «может отсутствовать»
std::optional<int> find(const std::string& key);
if (auto v = find("x")) { use(*v); }
// variant: «один из»
std::variant<int, std::string> v = "hello";
std::visit([](auto&& x) { std::cout << x; }, v); // pattern matching
// any: любой тип, доступ через cast
std::any a = 42;
int i = std::any_cast<int>(a);Приоритет: optional для «может отсутствовать», variant для «один из», any — последний выбор (набор типов неизвестен на этапе компиляции).
3Как отвечать
- Сначала уточните условия и ограничения, покажите аналитическое мышление.
- Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
- Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡
На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.