Mediumc++17variant

Что такое std::variant и в чём его отличие от union?

1Постановка

Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.

2Решение

std::variant<T1, T2, ...> (C++17) — type-safe union, хранит один объект одного из перечисленных типов. В отличие от union: знает текущий тип, корректно вызывает деструкторы, поддерживает сложные типы.

std::variant<int, std::string, double> v;
v = 42;
v = std::string("hi");

std::visit([](auto&& x) { std::cout << x; }, v);  // pattern matching

if (auto p = std::get_if<std::string>(&v))
    std::cout << *p;            // указатель или nullptr
// std::get<std::string>(v);     // бросает bad_variant_access

Преимущества над union:

  • index() возвращает текущий тип;
  • поддерживает string, vector (не только POD);
  • std::visit для pattern matching;
  • корректно разрушает при смене типа.

3Как отвечать

  • Сначала уточните условия и ограничения, покажите аналитическое мышление.
  • Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
  • Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡

На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.