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