У меня есть следующая иерархия:
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";
Есть ли лучший способ справиться с любой специализацией типа?