У меня есть следующая проблема:
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";
}
};
Если я сейчас сделаю
Derived derived;
Different different;
std::cout << "Derived: " << X::func(&derived) << std::endl;
std::cout << "Different: " << X::func(&different) << std::endl;
Я получаю
Derived: Generic
Different: Generic
Но я хочу, чтобы для всех классов, полученных из Base, вызывается конкретный метод. Таким образом, результат должен быть:
Derived: Specific
Different: Generic
Можно ли каким-либо образом переделать X: func (...) s для достижения этой цели?
EDIT:
Предположим, что вызывающий объект X:: func (...) не известен, если класс, представленный как параметр, получен из Base или нет. Таким образом, Casting to Base не является вариантом. На самом деле идея всего заключается в том, что X:: func (...) должен "обнаруживать", если параметр получен из Base или нет и вызывает другой код. И по соображениям производительности "обнаружение" должно быть сделано во время компиляции.