void* Typ testen?
-
Hallo,
in der WinAPI kann man Controls void* Meta Daten hinzufügen. Ich habe nun 2 structs Foo und Bar und adde einer Liste nun ab und zu diese Structs als Meta Daten (also in etwa addMetaData(&foo);
Jetzt lese ich die Meta Daten so:
void* p = getMetaData(index); // geht nicht anders! Die WinAPI liefert immer void*Wie weiß ich nun, ob p auf ein Foo oder Bar zeigt?
-
void-Zeiger sind wie eine Schachtel Pralinen, man weiß nie was man bekommt.
Moment, falscher Film...
Dann musst du eben irgendwie mit übergeben, was da kommt. Du kannst dir z.B. an die erste Stelle einen char schreiben, 'F' bedeutet, dahinter steht ein Foo, 'B' bedeutet, dahinter kommt ein Bar.
-
Die saubere Variante wäre Vererbung zu verwenden:
enum MetaDataType { MetaDataType_Foo, MetaDataType_Bar, }; struct MetaDataBase { MetaDataType type; }; struct Foo : MetaDataBase { ... }; struct Bar : MetaDataBase { ... }; void funfunfun() { Foo* foo = ...; setMetaData(static_cast<MetaDataBase*>(foo)); } void morefun() { MetaDataBase* md = static_cast<MetaDataBase*>(getMetaData()); if (md->type == MetaDataType_Foo) { Foo* foo = static_cast<Foo*>(mi); // ... } else if (md->type == MetaDataType_Bar) { Bar* bar = static_cast<Bar*>(mi); // ... } }
-
Oder wenns geht noch besser:
class Metadata { public: virtual void doWhateverYouWannaDo() = 0; }; class Foo : public Metadata { public: void doWhateverYouWannaDo() {...} }; class Bar : public Metadata { public: void doWhateverYouWannaDo() {...} }; void morefun() { Metadata* md = static_cast<Metadata*>(getMetaData()); md->doWhateverYouWannaDo(); }
-
Jupp, das wäre noch besser.
-
Aber zurück zur Frage: Füge beiden Strukturen doch magische Zahlen hinzu, dann kannst Du beide voneinander identifizieren.
-
SeppJ schrieb:
void-Zeiger sind wie eine Schachtel Pralinen, man weiß nie was man bekommt.
void-Zeiger sind das Leben? 
-
ForrestGump schrieb:
SeppJ schrieb:
void-Zeiger sind wie eine Schachtel Pralinen, man weiß nie was man bekommt.
void-Zeiger sind das Leben? 
Bevor Beschwerden kommen...
Ich weiß, dass man nicht folgern darf
A => C B => C ------ A == B
-
~void* schrieb:
Aber zurück zur Frage: Füge beiden Strukturen doch magische Zahlen hinzu, dann kannst Du beide voneinander identifizieren.
Zurück von wo? Von unserem Ausflug zu "wie man es richtig machen würde"?
Ja, wenn du meinst