2009-11-07 16 views
6

Me gustaría poder registrar mis clases dentro de un std::map o un vector, no piense en duplicados y tales por ahora, pero no quiero registrarlo en el llamada de constructor de clase o cualquiera dentro de la función de la clase, de alguna manera hacerlo fuera de la clase, así que incluso si nunca lo instancia, podría saber que existe.De alguna manera, registrar mis clases en una lista

Ejemplo:

// 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{ 

} 

Entonces me haría un #define de ella o si es capaz, una plantilla.
No sé si me hice claro (de nuevo) ... Mi punto es que necesito saber cada clase que tengo sin tener que llamar a todos y cada uno de ellos.
Mi idea era crear un #define para que sea más fácil para declarar la cabecera de la clase y llamar a algo que podría registrar esa clase específica a una lista

Se puede hacer esto o voy a tener que asignar manualmente?

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

sé, que definen con que no podía utilizar la herencia, etc ... Mi punto era tratar de dar un ejemplo de lo que estaba pensando para crear de alguna manera ...

+0

Creo que deberías agregar la etiqueta 'design-pattern'. – Alexandru

Respuesta

9

Aquí es el método poner nombres de clases dentro de un vector. Deja un comentario si me pierdo detalles importantes. Aunque no creo que funcione para plantillas.

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); 

El truco aquí es hacer algún cálculo antes de main() se llama y se puede lograr esto a través de la inicialización global. REGISTER_CLASS (cls) en realidad genera código para llamar al constructor de MyClasses al inicio del programa.

ACTUALIZACIÓN: Siguiendo la sugerencia gf puede escribir esto:

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

Lo siento, pero no lo entendí ... ¿cómo podría hacer para declarar la clase con su código? – Jonathan

+0

a excepción de std :: string/string – ScottJ

+0

@Jonathan: publicó el ejemplo sobre XYZ. ¿Es esto lo que querías? – Alexandru

-2

Uso impulso :: MPL, vector o un mapa.

Cuestiones relacionadas