Hardenable-ifsfinae

Что такое std::enable_if и как им пользоваться?

1Постановка

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

2Решение

`std::enable_if<Condition, T>::type` — это T, если Condition == true, иначе тип не определён (substitution failure). Включает перегрузку условно.

// Функция существует только для интегральных типов
template<typename T,
         typename = std::enable_if_t<std::is_integral_v<T>>>
T add_one(T x) { return x + 1; }

Три места для enable_if:

  • в template-параметрах (как выше) — но нельзя перегружать по Condition;
  • в return type: auto f(T) -> std::enable_if_t<..., void>;
  • в параметре функции: void f(T, std::enable_if_t<...>* = nullptr);

С C++14 есть _t alias, с C++17 _v для trait-ов. В C++20 заменяется на concepts.

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

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

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