В следующем коде есть пара регулярных перегрузок функций, и - теперь - функция шаблона, предназначенная как универсальная, если перегрузка не подходит.
Это почти работает как яхочу, за исключением того, что использование производных классов (которые ранее заканчивались обычной перегрузкой) вместо этого обрабатывается шаблоном функции.
#include <iostream>
class Base { };
class AnotherBase { };
class Derv : public Base{ };
class Derv2 : public Base { };
class DervDerv : public Derv { };
void f(const Base &b)
{
printf("b(Base)\n");
}
void f(const Derv &b)
{
printf("b(Derv)\n");
}
template<class T> void f(const T& t)
{
printf("b(template)\n");
}
int main() {
f(Base());
f(AnotherBase());
f(Derv());
f(Derv2());
f(DervDerv());
return 0;
}
Таким образом, вывод, который я получаю, это ...
b(Base)
b(template)
b(Derv)
b(template)
b(template)
... когда то, что я наивно ожидал, было следующим:
b(Base)
b(template)
b(Derv)
b(Base)
b(Derv)
Действительно ли перегрузка функции базового класса оценивается как "более низкое качество", чем шаблон функции?Если так, есть ли простой способ изменить это?
https://ideone.com/jD2lgz