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