У меня следующая иерархия:
class base
{
public:
virtual ~base(){}
virtual void foo() {}
};
template <typename T>
class derived1 : public base
{
virtual void foo() {};
};
template <typename T>
class derived2 : public base
{
virtual void foo() {};
};
Теперь, имея указатель на базу, я хотел бы узнать, базовый является либо производным1, либо производным2. Проблема в том, что как производный1, так и производный2 могут быть специализированы на многих различных типов, использующих dynamic_cast для проверки понижающего приведения, требуется тип шаблона, который нужно знать. В итоге у меня получился запутанный, незаметный и неполный фрагмент кода:
base* b = new derived1<int>();
if (dynamic_cast<derived1<int>*> ||
dynamic_cast<derived1<unsigned int>*> ||
dynamic_cast<derived1<double>*>)
std::cout << "is derived1";
else if (dynamic_cast<derived2<int>*> ||
dynamic_cast<derived2<unsigned int>*> ||
dynamic_cast<derived2<double>*>)
std::cout << "is derived2";
Есть ли лучший способ справиться со специализацией любого типа?