Struct Member auslesen...ohne den Namen zu kennen



  • Moin,
    Ich habe ein struct und weiß nur den Typ der Member und deren Reihenfolge, aber
    nicht wie sie im struct benannt worden sind. Kann man trotzdem irgentwie auf den Inhalt zugreifen und wenn ja wie?

    MFG Olbrisch



  • Hallo

    Bau ein eigenes struct mit den notwengigen Membern und Namen wie du willst. Dann caste den Speicherbereich mit reinterpret_cast auf ein Pointer deines structs.

    Namen spielen in C++ zur Laufzeit eh keine Rolle mehr, nur Speicherbelegung.

    bis bald
    akari



  • Hi,

    prinzipiell hat akari natürlich Recht, aber was bedeutet das hier:

    Olbrisch schrieb:

    ...Ich habe ein struct ...

    eigentlich ?
    Wann hat man ein struct ?
    Ein struct ist eine Strukturbeschreibung von Daten ... wenn Du sie hast, hast Du sie und mit C++-Syntax kannst Du auf diese Daten zugreifen (da braucht's auch keinen cast mehr) ... wenn Du sie nicht hast, hast Du sie eben nicht.
    Aber Haben und gleichzeitig nicht-Haben, verstehe ich nicht.

    Gruß,

    Simon2.



  • Moin,
    Also ich habe ein Funktions Template, also eine Funktion...
    Der Benutzer dieser Funktion darf sich in seinem Programm ein Struct programieren
    und eine Variable vom Typ der Structur, die er erstellt hat, übergibt er an die Funktion
    (im Template gibt er sein struct an), zusätzlich gibt er an welche Typen er in diesem Struct verwendet hat
    (in einem extra parameter dieser Funktion).
    In der Funktion möchte ich jetzt gerne auf die "Member" zugreifen.

    also ich könnte für jede kombination ein struct bereit stellen, aber ich hoffe noch
    das es einfacher geht.

    Das ganze soll ungefähr so sein wie das FVF von DirectX...jedenfals so wie ich das immoment verstanden habe.

    MFG



  • struct foo
    {
        int int_value0;
        int int_value1;
    };
    
    struct bar
    {
        short short_value0;
        short short_value1;
    };
    
    foo a_foo;
    
    // als bar* interpretieren
    bar* a_bar = reinterpret_cast<bar*>(&a_foo);
    
    // oder auch als uchar-array
    unsigned char* rawmemory = reinterpret_cast<unsigned char*>(&a_foo);
    

    wahrscheinlich hilfreich: http://www.cplusplus.com/reference/clibrary/cstddef/offsetof.html



  • Also für mich klingt das eher danach, als ob hier saubere Kapselung das Beste wäre. Warum nicht verlangen, dass der instantiierende Typ bestimmte (mit definierten Namen) Zugriffsfunktionen hat ?
    Das wäre IMHO eine saubere Schnittstellendefinition ... und deutlich sicherer und übersichtlicher als so ein Speichergefummel zur Laufzeit (zumal die Verwendung von templates ja sowieso belegt, dass eine Evaluation zur Compilezeit ausreicht).

    Gruß,

    Simon2.


  • Mod

    Zeiger auf Member? Die Aufgabenstellung ist immer noch ziemlich unklar.



  • Moin,
    genau! sowas wie Zeiger auf Member!

    Immoment sehe ich das aber ein,dass das irgentwie ein nicht so sauberer Weg ist,
    nur wie/warum macht das Microsoft bei DirectX beim Flexiblen Vertex Format?

    MFG Olbrisch



  • Olbrisch schrieb:

    nur wie/warum macht das Microsoft bei DirectX beim Flexiblen Vertex Format?

    weil directx kein c++-api ist.


Anmelden zum Antworten