Wie generische Meta Data?
-
Abend,
ich brauche für eine Klasse generische User Data, sprich man soll an die Klasse irgend ein Objekt dranhängen können.
z.B. so:
Object* o1 = new Object; o1->setUserData( new int(3) ); // User Data = simpler int struct Foo { string s; double d; }; Object* o2 = new Object; o2->setUserData( new Foo("Hi", 22) ); // Diesmal ist User Data ein Foo ObjektIch will NICHT Foo zu einem Template machen! Wie könnte man das machen?
Ich dachte erst, dass ich Object einen shared_ptr<??> hinzufüge, aber welchen Typ sollte ich dann dem shared_ptr geben? void* geht ja nicht, oder?
-
C++C schrieb:
ich brauche für eine Klasse generische User Data
Gib jeder Klasse eine ID und nimm die als Index für eine std::map<int, user_data_type>.
Ich dachte erst, dass ich Object einen shared_ptr<??> hinzufüge, aber welchen Typ sollte ich dann dem shared_ptr geben?
Wenn du unbedingt einen shared_ptr in Verbindung mit Type erasure willst, kannst du shared_ptr<boost:.any> nehmen.
-
Er kann auch gleich boost::any verwenden.
Ich habe mir die Implementation zwar nicht angeschaut,
aber ich würde eine any-Klasse intern auch durch einen Zeiger realisieren:class any { class basic_holder; template <typename T> class holder { }; basic_holder * data_; public: // Beispiel operator = template <typename T> any & operator = (T const & val) { delete data_; data_ = new holder<T>(val); return *this; } };Für den Fall, dass er kein boost nutzen möchte, wäre das ein Ansatz.