Используя VC ++ 2010, учитывая следующее:
class Base { };
class Derived : public Base { };
template<class T> void foo(T& t); // A
void foo(Base& base); // B
Derived d;
foo(d); // calls A
foo(static_cast<Base&>(d)); // calls B
Я бы хотел, чтобы выше вызывался "B". Я могу добиться этого с помощью преобразования в Base
, но зачем это нужно?
Я хочу, чтобы функция шаблона вызывалась для всех типов, не производных от Base
(встроенный типы и т. д.), но я хочу, чтобы не-шаблонная перегрузка вызывалась для типов, производных от Base
, не требуя от клиента явного приведения типов. Я также попытался сделать перегрузку специализацией шаблона, но в этом случае происходит то же самое. Какой идиоматический способ получить то, что я ищу?