Objekttyp als String



  • Moin,

    Weiss jemand ob / wie es möglich ist einen Objekttyp in einen String zu verwandeln?

    Also dass für die Klasse clBaseBlah dann ein String mit "clBaseBlah" rauskommt?


  • Mod

    Was hast du vor? Es gibt mehrere Möglichkeiten:
    1. typeid, das wird aber bloß eine kryptische Abkürzung erzeugen
    2. du programmierst es dir selber.

    Das ganze Vorhaben klingt jedoch nicht sehr sinnvoll, C++ hat keine Reflections. Eigentlich sollte man auch keine brauchen. Daher nochmal: Was hast du vor?



  • Das geht nicht zuverlässig. In Grenzen geht das mit typeid(obj).name() . Das Ergebnis ist allerdings stark Implenetierungsabhängig (also von Deinem Compiler). Ich hatte schon Compiler, die hier einen Leerstring geliefert haben.



  • Das geht, wenn du bereit bist, Klassen selbststaendig (ueber ein Makro) zu registrieren.



  • Kellerautomat schrieb:

    Das geht, wenn du bereit bist, Klassen selbststaendig (ueber ein Makro) zu registrieren.

    Aaah... Sowas wie

    #define REGISTER_DEC_TYPE(NAME) \
        static DerivedRegister<NAME> reg
    
    #define REGISTER_DEF_TYPE(NAME) \
        DerivedRegister<NAME> NAME::reg(#NAME)
    

    ?

    Hangel mich gerade an diesem
    http://stackoverflow.com/questions/582331/is-there-a-way-to-instantiate-objects-from-a-string-holding-their-class-name

    Post entlang, aber die Sache mit den Macros hab ich wohl überlesen. Hättest du da vielleicht ein Beispiel/Doku dazu?

    Konkret bekomme ich per Telegramm einen String. den ich in verschiedene Structs aufteilen soll, je nachdem was im ersten Abschnitt für Structs genannt werden.
    Hab bisher eine Basis gestrickt aus Templates und versuche den String mit Hilfe des Factory-Patterns aufzudröseln.


  • Mod

    Sharkbyte schrieb:

    Konkret bekomme ich per Telegramm einen String. den ich in verschiedene Structs aufteilen soll, je nachdem was im ersten Abschnitt für Structs genannt werden.
    Hab bisher eine Basis gestrickt aus Templates und versuche den String mit Hilfe des Factory-Patterns aufzudröseln.

    Das ist ja quasi der umgekehrte Fall wie du es im Eingangspost darstellst. Der stackoverflow-Beitrag den du verlinkt hast zeigt doch schon eine Lösung. Das wäre auch das erste gewesen, an das ich gedacht hätte. Denk dran, dass der Kern der Lösung natürlich der Code darüber ist. Die Nutzung des Präprozessors dient nur dazu, da man mit diesem aus Compilezeitbezeichnern eben auch einfach Zeichenketten generieren kann, da der Präprozessor bloß eine dumme Textersetzung ist, die von C++ an sich nichts versteht. Kellerautomat denkt bestimmt an eine ganz ähnliche Lösung, bloß umgekehrt.





  • SeppJ schrieb:

    Sharkbyte schrieb:

    Konkret bekomme ich per Telegramm einen String. den ich in verschiedene Structs aufteilen soll, je nachdem was im ersten Abschnitt für Structs genannt werden.
    Hab bisher eine Basis gestrickt aus Templates und versuche den String mit Hilfe des Factory-Patterns aufzudröseln.

    Das ist ja quasi der umgekehrte Fall wie du es im Eingangspost darstellst. Der stackoverflow-Beitrag den du verlinkt hast zeigt doch schon eine Lösung. Das wäre auch das erste gewesen, an das ich gedacht hätte. Denk dran, dass der Kern der Lösung natürlich der Code darüber ist. Die Nutzung des Präprozessors dient nur dazu, da man mit diesem aus Compilezeitbezeichnern eben auch einfach Zeichenketten generieren kann, da der Präprozessor bloß eine dumme Textersetzung ist, die von C++ an sich nichts versteht. Kellerautomat denkt bestimmt an eine ganz ähnliche Lösung, bloß umgekehrt.

    Da ich die Makros nicht gesehen / richtig interpretiert habe und die Aussage immer war "Man kann kein Objekt aus einem String erzeugen", wollte ich umgedreht halt beim registrieren der structs aus dem structnamen einen string erzeugen.

    Bin leider ganz und gar nicht makrofest, ist

    DerivedRegister<NAME> NAME::reg(#NAME)
    

    der Abschnitt der den string erzeugt? Mit #NAME?



  • Kellerautomat schrieb:

    Eher sowas: http://ideone.com/JXFkg0

    Aber da schreibst du ja manuell jeweils den string dazu. Kann man das nicht umgehen?

    Ansonsten freu mich schon darauf ~200 structs taufen zu dürfen. ^^



  • Klar kann man das.



  • Und zwar mit dem Präprozessor-Operator # .



  • Nexus schrieb:

    Und zwar mit dem Präprozessor-Operator # .

    Lass mich doch zuende tippen 🙂

    #include <iostream>
    #include <string>
    using namespace std;
    
    class Hallo {};
    class Blub {};
    
    #define AsString(Typ) \
        #Typ
    
    int main()
    {
        string s = AsString(Hallo);
        cout << s << " " << AsString(Blub) << endl;
    }
    


  • Perfekt, danke 🙂


Anmelden zum Antworten