Рассмотрим следующий пример программы:
#include <iostream>
template<typename T>
struct Dispatch
{
static void send(T&) { std::cout << "unknown\n"; }
};
struct Processor
{
template<typename T>
void process(T&& t) { Dispatch<T>::send(t); }
};
template<typename T>
struct Base
{};
template<typename T>
struct Dispatch<Base<T>>
{
static void send(Base<T>&) { std::cout << "base\n"; }
};
struct Deriv : Base<int>
{};
int main()
{
Processor p;
p.process(Base<int>{}); // prints "base"
p.process(Deriv{}); // prints "unknown"
return 0;
}
При вызове Processor::process()
с экземпляром Deriv
(который является подклассом Base
), я бы хотел, чтобы Dispatcher()
специализировался для Base
шаблоны классов для выбора.
Однако в приведенном выше примере происходит следующее:
- передача экземпляра
Base<T>
в process()
вызывает специализацию Base<T>
- передача экземпляра
Deriv
в process()
вызывает шаблон основного класса
Вопрос:
- Почему
Base<T>
не лучшая специализация для Deriv
, чем шаблон основного класса? - Существует ли общий способ вызова специализации
Base<T>
при передаче подклассов Base<T>
?