Hardoverload resolution
Чем overload resolution сложен для шаблонов?
1Постановка
Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.
2Решение
При перегрузке шаблонов и не-шаблонов компилятор выбирает по правилам: точное совпадение обычной функции лучше инстанциации шаблона; более специализированный шаблон лучше общего; при равенстве выигрывает не-шаблон.
template<class T> void f(T); // (1) общий
template<class T> void f(T*); // (2) специализированный для указателей
void f(int); // (3) не-шаблон
f(42); // (3) — не-шаблон лучше шаблона при равенстве
f((int*)nullptr); // (2) — специализация для T* лучше (1)- Специализация шаблона НЕ участвует в overload resolution напрямую — выбирается после выбора шаблона;
- Поэтому функции нельзя частично специализировать — только перегружать;
- Для выбора между перегрузками: tag dispatch, concepts или
enable_if; - Concepts в C++20 делают ошибки понятными.
3Как отвечать
- Сначала уточните условия и ограничения, покажите аналитическое мышление.
- Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
- Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡
На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.