Sonntag, 7. Januar 2007

mehr, als man denkt

hiermit eröffne ich ne Kategorie, wo ich hoffe, dass da schön viele einträge reinkommen...
"Art of Code" - hier kommen kleine snippets rein, welche sozusagen den trick 17 in C++ benutzten. Advanced techniques--

hier also das erste Snippet:

#define EXPORT(className, stat) static bool _init_##className = objFactory::getInstance().registrate<classname>(#className, objCreator<classname>(stat));

Schick, oder? wer mir auf den ersten blick sagen kann, was das macht, bekommt n Keks!
Aber ich schreib hier ja keine rätsel, also:
Ziel war es, eine einfache möglichkeit zu finden, dem prorgammierer zu erlauben, klassen zu schreiben und die in ner Factory (aka DLL-Interface) zu registriern, das aber ohne, dass der benutzter ne extra funktion schreiben muss oder überhaupt viel mehr schreiben muss als unbedingt nötig.
ich suchte also ne möglichkeit, ohne ne funktion zu erstellen, ne funktion von der factory aufzurufen...static is die lösung!
mit static kann man statische variablen anlegen zb globale.
static int bla = 4;
statische variablen in DLLs werden genau dann initialisiert, wenn die DLL geladen wird.
Was, wenn man nun funktionen statt feste werte als initialisierung angibt? geht natürlich auch:
static int bla = func();
ok, soweit, so gut.
das makro da oben macht nix andres als ne static bool variable anzulegen mit _init_klassenname und initialisiert die mit der registriermethode der factory...
aber wie den typ übergeben? template-magic is da natürlich die einzige lösung
also bau ich mir n objCreator, das ist eine klasse, welche den übergebenen typ instanziiert und ne methode create hat, die mir ne instanz des Typs zurückgibt.
nun wird per #classname der klassenname in n string umgewandelt, und schon hab ich ne string-=-Typ beziehung.
Ich hab dann noch die möglichkeit eingebaut, dass der Objcreator entweder immer n neues Objekt (halt per new) zurückgibt, was aber automatisch bei entladen der DLL gelöscht wird, oder n statisches Objekt (also immer dieselbe instanz).

naja, haltet mich für verrückt, aber genau wegen solchen sachen liebe ich C++

Keine Kommentare: