ho la seguente gerarchia:downcasting dal puntatore base ai tipi di derivati su modelli
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() {};
};
Ora dato un puntatore alla base, mi piacerebbe sapere se il sottostante è sia derived1 o derived2. Il problema è che sia derivato1 che derivato2 possono essere specializzati su molti diversi tipi , l'uso di dynamic_cast per testare un cast down richiede che il tipo di modello sia noto. Ho finito con po 'disordinato, unmaintable e incompleta di codice:
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";
Esiste un modo migliore, in grado di gestire qualsiasi tipo di specializzazione?
Cosa intendi fare una volta che sai che il tipo è una specializzazione di uno dei modelli derivati? –
@James: chiama una funzione specifica per ognuna - btw c'è più di derivata1 e derivata2 –
Il codice condizionale che deve verificare dinamicamente il tipo concreto di un puntatore di classe base è un odore di codice errato. C'è probabilmente un modo per cambiare il tuo design per evitare questo. –