2009-11-07 15 views
6

Vorrei poter registrare le mie classi all'interno di un std::map o un vettore, non pensare ai duplicati e ad esempio per ora, ma non voglio registrarlo all'interno del chiamata del costruttore di classe o qualsiasi funzione interna alla classe, in qualche modo lo fanno al di fuori della classe, quindi, anche se non lo istanziamo mai, sarei in grado di sapere che esiste.In qualche modo registrare le mie classi in un elenco

Esempio:

// Somehow, from outside the myclass, in a scope that will be called 
//in the begining of the proccess, add "MyClass1" to a 
//list so it can be instanciated later 
class MyClass1{ 

} 

Poi vorrei fare una #define di esso o se in grado, un modello.
Non so se mi sono chiarito (di nuovo) ... Il mio punto è che ho bisogno di conoscere ogni classe che ho senza dover chiamare tutti e ciascuno di loro.
La mia idea era quella di creare un #define per rendere più facile per dichiarare l'intestazione della classe e chiamare qualcosa che registro che specifica classe a un elenco

Questo può essere fatto o dovrò mappare manualmente?

// desirable: 
#define CLASSREGISTER(myclass) makethemagic(##myclass); class myclass { 
}; 

so, con che definiscono non ho potuto utilizzare l'ereditarietà ecc ... Il mio punto è stato quello di cercare di dare un esempio di quello che stavo pensando di creare in qualche modo ...

+0

Penso che dovresti aggiungere il tag "design-pattern". – Alexandru

risposta

9

Ecco metodo mettere i nomi delle classi all'interno di un vettore. Lascia un commento se ho dimenticato i dettagli importanti. Non penso che funzionerà per i modelli, però.

struct MyClasses { 
    static vector<string> myclasses; 
    MyClasses(string name) { myclasses.push_back(name); } 
}; 

#define REGISTER_CLASS(cls) static MyClasses myclass_##cls(#cls); 

struct XYZ { 
}; 

REGISTER_CLASS(XYZ); 

Il trucco è quello di fare qualche calcolo prima di main() si chiama e si può raggiungere questo obiettivo tramite l'inizializzazione globale. REGISTER_CLASS (cls) genera effettivamente il codice per chiamare il costruttore di MyClasses all'avvio del programma.

UPDATE: Dopo gf suggerimento che potete scrivere questo:

#define REGISTER_CLASS(cls) temp_##cls; static MyClasses myclass_##cls(#cls); class cls 
class REGISTER_CLASS(XYZ) { int x, y, z; } 
+0

Scusa, ma non l'ho capito ... come dovrei fare per dichiarare la classe con il tuo codice? – Jonathan

+0

ad eccezione di std :: string/string – ScottJ

+0

@Jonathan: pubblicato l'esempio su XYZ. Questo è quello che volevi? – Alexandru

-2

Usa boost :: MPL, il vettore o una mappa.

Problemi correlati