Priorytet przy wyborze przeciążonych funkcji szablonów w C ++

Mam następujący problem:

class Base
{
};

class Derived : public Base
{
};

class Different
{
};

class X
{
public:
  template <typename T>
  static const char *func(T *data)
  {
    // Do something generic...
    return "Generic";
  }

  static const char *func(Base *data)
  {
    // Do something specific...
    return "Specific";
  }
};

Jeśli teraz to zrobię

Derived derived;
Different different;
std::cout << "Derived: " << X::func(&derived) << std::endl;
std::cout << "Different: " << X::func(&different) << std::endl;

dostaję

Derived: Generic
Different: Generic

Ale chcę, aby dla wszystkich klas wywodzących się z Base określana była konkretna metoda. Tak więc wynik powinien być:

Derived: Specific
Different: Generic

Czy w jakiś sposób mogę przeprojektować X: func (...), aby osiągnąć ten cel?

EDYTOWAĆ:

Załóżmy, że nie jest on znany przez program wywołujący X :: func (...), jeśli klasa przesłana jako parametr pochodzi z bazy lub nie. Więc Casting to Base nie jest opcją. W rzeczywistości pomysłem na to wszystko jest to, że X :: func (...) powinien „wykryć”, jeśli parametr pochodzi z Base lub nie i wywołać inny kod. Ze względu na wydajność „wykrywanie” powinno być wykonywane w czasie kompilacji.

questionAnswers(6)

yourAnswerToTheQuestion