tengo la siguiente jerarquía:downcasting desde un puntero base para los tipos derivados de plantilla
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() {};
};
Ahora da un puntero a la base, me gustaría saber si el subyacente es bien Derived1 o derived2. El problema es que tanto derivado1 como derivado2 pueden especializarse en muchos tipos diferentes de , utilizando dynamic_cast para probar si un lanzamiento descendente requiere que se conozca el tipo de plantilla . He terminado con poco desordenado, unmaintable e incompleta de código:
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";
¿Hay una mejor manera, que puede manejar cualquier tipo de especialización?
¿Qué piensas hacer una vez que sabes que el tipo es una especialización de una de las plantillas derivadas? –
@James: llame a una función en particular para cada uno - por cierto, hay más que derivada1 y derivada2 –
El código condicional que necesita probar dinámicamente el tipo concreto de un puntero de clase base es un mal olor de código. Probablemente haya una manera de cambiar su diseño para evitar esto. –