Преобразование базового указателя в производные по шаблонам типы

У меня следующая иерархия:

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";

Есть ли лучший способ справиться со специализацией любого типа?

7
задан Xander Tulip 5 March 2012 в 03:58
поделиться