Mediumbest practices

Что такое tag dispatch?

1Постановка

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

2Решение

Tag dispatch — выбор перегрузки через dummy-параметр-тег из trait. Компилятор выбирает перегрузку по типу тега.

template<class It>
void advance_impl(It& it, int n, std::random_access_iterator_tag) {
    it += n;   // O(1) для random access
}
template<class It>
void advance_impl(It& it, int n, std::input_iterator_tag) {
    for (int i = 0; i < n; ++i) ++it;   // O(n) для input
}

template<class It>
void advance(It& it, int n) {
    advance_impl(it, n,
        typename std::iterator_traits<It>::iterator_category{});
}
  • Применяется в STL: std::advance, std::distance, std::sort;
  • Плюсы: читаемо, явно, работает с C++98;
  • С C++17 if constexpr заменяет во многих случаях.

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

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

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