PDA

View Full Version : [C++]Ricostruire la gerarchia delle classi a runtime


Tommo
06-04-2009, 16:26
Salve,
dato che sto costruendo un framework "sperimentale" da 0, che sfrutta pesantemente il polimorfismo, mi son scontrato molto presto con una delle limitazioni del C++...
cioè che il downcast è spesso un'operazione brutta, lunga e difficile a farsi, a causa della mancanza di riflessività.

Per esempio, se una pipeline riceve un Buffer*, non c'è un modo elegante per assicurarsi che quel buffer non sia un Buffer2D* oppure una Texture*, un Viewport*... se non con checks con stringhe, o con typeid, o fidandosi e basta :asd:
insomma, passando un pointer alla classe base si ottiene un'interfaccia pulita ma un'implementazione pessima.

Per cui mi chiedevo se sia possibile trovare i nomi di tutte le superclassi di una data classe, e magari salvarseli in una pila di quella classe :mc:
Questo permetterebbe un bel pò di riflessività in più, unita a metodi template che possono fare downcast con assoluta certezza:


Pipeline::renderTo( Buffer* target )
{
if( target->implements("Texture") )
{
Texture* tex = target->as<Texture>();
....
else if( target->implements("Viewport") )
{
....

Ottenendo un semplice null nel caso Texture non sia parte del pointer interessato... un pò come fa già dynamic_cast ma in maniera più leggibile e rapida (si tratterebbe di 3-4 confronti di hash).

Tuttavia non ho proprio idea di come costruire automaticamente questa pila di stringhe, se non chiamando a mano typeid(this).name in ogni costruttore del framework (e in ogni costruttore che usa una classe del framework):stordita:
Può aiutare il fatto che gli oggetti del framework hanno un metodo new custom?

Faccio meglio a lasciar stare? :asd:

Tommo
07-04-2009, 21:25
Nessuna idea?
Devo dedurre che la risposta alla mia ultima domanda sia "si" :asd:

Sono riuscito in realtà a costruire una lista ordinata dei nomi delle superclassi, mettendo uno stack di stringhe dentro alla classe base ed usando

class_stack.push( typeid( this ).name );

In ogni costruttore...
Tuttavia queste informazioni non sono disponibili staticamente... quindi in fase di confronto mi servono a poco...:stordita: