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 подскажет развёрнутый ответ в реальном времени.