Mediumc++17any

Что такое std::any и когда его применять?

1Постановка

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

2Решение

std::any (C++17) — контейнер для значения любого типа (type-erased). В отличие от variant, тип не фиксируется заранее. Хранит через динамическую аллокацию (с SBO для маленьких типов).

std::any a = 42;
a = std::string("hi");

if (a.type() == typeid(std::string)) {
    std::string& s = std::any_cast<std::string&>(a);  // бросает bad_any_cast если не тот тип
}
auto p = std::any_cast<int>(&a);  // указатель или nullptr

Используется редко: для API, где тип определяется в рантайме (плагины, скриптовые системы), конфигов с гетерогенными значениями, opaque-данных.

В большинстве случаев лучше variant (compile-time список типов) или полиморфизм через базовый класс — any жертвует безопасностью типов ради гибкости.

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

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

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