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 Objekt
    

    Ich 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.


Log in to reply