У меня сложилось впечатление, что перегруженные функции всегда будут иметь преимущество перед шаблонами.
Это верно, но только когда функции без шаблонов и шаблонные функции одинаково хороши.В этом случае используется не шаблонная функция.
В этом случае, хотя они не одинаково хороши.t2
- это TheTest
, когда запускается разрешение перегрузки, он находит void handle(ITest &t)
и void handle(TheTest par)
(я создал экземпляр шаблона здесь).Так как версия шаблона даст точное совпадение, она является лучшей функцией и выбрана.
Способ исправить это - заставить шаблон работать только для типов, которые не являются производными от ITest
.Если вы измените функцию шаблона на
template<typename T, std::enable_if_t<!std::is_base_of_v<ITest, T>, bool> = true>
void handle(T par)
{
par++;
}
, тогда она будет вызываться только для типов, которые не являются производными от ITest
.Вы можете увидеть, как это работает в этом живом примере .