|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Feb 2006
Messaggi: 1304
|
[C++]Ricostruire la gerarchia delle classi a runtime
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 ![]() 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 Questo permetterebbe un bel pò di riflessività in più, unita a metodi template che possono fare downcast con assoluta certezza: Codice:
Pipeline::renderTo( Buffer* target )
{
if( target->implements("Texture") )
{
Texture* tex = target->as<Texture>();
....
else if( target->implements("Viewport") )
{
....
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) ![]() Può aiutare il fatto che gli oggetti del framework hanno un metodo new custom? Faccio meglio a lasciar stare?
Ultima modifica di Tommo : 06-04-2009 alle 17:34. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Feb 2006
Messaggi: 1304
|
Nessuna idea?
Devo dedurre che la risposta alla mia ultima domanda sia "si" ![]() 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...
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 19:24.





















