Type - unsigned int Mapping
-
Hallo,
ich versuche grade, einer Reihe von Typen jeweils eine eindeutige ID zuzuweisen. Das Ganze wäre einfach, wenn ich eine TypeList oder etwas Ähnliches der Types hätte, das funktioniert aber leider nicht. Stattdessen muss ich in einem Template ohne Kenntnis der anderen Types auf die ID zugreifen können. Es ist dabei nur wichtig, dass ich vom Type auf die ID komme, nicht umgekehrt. Mein Versuch war jetzt sowas:unsigned int nextID() { static unsigned int current_id = 0; ++current_id; return current_id; } template< class Type > unsigned int typeID() { static unsigned int id = nextID(); return id; }Das scheint auch zu funktionieren, jedenfalls mit dem gcc. Weil ich quasi nie "static" verwende, bin ich mir aber unsicher, ob ich nicht einfach Glück hatte, dass die statischen Variablen in der richtigen Reihenfolge initialisiert wurden...
Hab ich das richtig in Erinnerung, dass statische Variablen in einer Funktion beim ersten Aufruf der Funktion initialisiert werden? (Hat wer nen link, auf dem das nochmal genau beschrieben wird? Finde immer nur, wie man static initialization order fiasco vermeidet, aber nichts dazu, wann genau die Reihenfolge zur Initialisierung statischer/globaler Variablen festgelegt ist und wann nicht)
-
GorbGorb schrieb:
Hab ich das richtig in Erinnerung, dass statische Variablen in einer Funktion beim ersten Aufruf der Funktion initialisiert werden?
Ja.
-
Ich bin neugierig, wofür du das verwenden willst.
-
Ich baue grade ein Framework für Entity Based Design. Dabei setzt man ein Ding (->Entity) aus mehreren Komponenten zusammen.
(Wens interessiert:
http://t-machine.org/index.php/2007/09/03/entity-systems-are-the-future-of-mmog-development-part-1/
Ist zwar meiner Ansicht nach ziemlich hässlicher Code den der Autor da postet, aber das Konzept finde ich super.)
Dann will ich sowas machen:int main() { SpecificEntity< ComponentA , ComponentB > specific_entity; BasicEntity &basic_entity = specific_entity; basic_entity.getComponent< ComponentA >(); //->Pointer auf ComponentA basic_entity.getComponent< ComponentX >(); //->NULL basic_entity.getComponent< ComponentB >(); //->Pointer auf ComponentB }Ich würde dazu dann einfach in BasicEntity Paare aus ID und void* speichern, in "getComponent" die ID der Komponente ermitteln
und schauen ob dazu ein void* Pointer da ist, der dann auf den Komponententyp gecastet wird.
PS: Habt ihr mir den guten Link zur Initialisierungsreihenfolge?