Theoretische Frage: Enum zur Laufzeit weitere Elemente hinzufügen



  • Hallöchen,

    ich habe eine theoretische Frage zu Enums (lässt der Titel ja schon vermuten 😃 ).

    Ist es möglich/erlaubt, einer Enum zur Laufzeit weitere Elemente hinzuzufügen?

    z.B. so:

    //vorher
    enum myEnum{a,b,c};
    
    //Element hinzufüge
    void addElementToEnum();
    
    //nachher
    enum myEnum{a,b,c,d};
    

    Dass es grundsätzlich möglich ist, weiß ich. Man kann dazu mit einer Funktion einen dynamischen Code generieren, der die Enum mit den entsprechenden Elementen enthält usw...

    Nach meinem Wissen und meinem Bauchgefühl sollte es nur so gehen.
    Ich möchte aber wissen, ob es auch andere, einfachere Möglichkeiten gibt.
    Womöglich sogar welche, die von C++ von Haus aus unterstützt werden 😃

    Eine weitere Frage zu Enums hätte ich noch:
    Werden die Elemente standardmäßig als int definiert? Soweit ich weiß, kann man ja auch einen anderen integralen Typ für die Elemente definieren.

    Um gleich der Kritik am Beispiel-Code zuvorzukommen: Ich weiß, dass der Code alles andere als korrekt ist und welche Fehler da sind, soll nur die Frage verdeutlichen 😉

    Viele Grüße
    Cherup



  • Nein, das ist nicht möglich. Weder theoretisch noch grundsätzlich noch sonstwie.



  • Cherup schrieb:

    Dass es grundsätzlich möglich ist, weiß ich. Man kann dazu mit einer Funktion einen dynamischen Code generieren, der die Enum mit den entsprechenden Elementen enthält usw...

    Das ist Blödsin. Man kann enums zur Laufzeit nicht erweitern. Welchen Sinn sollte das auch haben?



  • "Sinn" machts, wenn man z.B. ein allgemeines Codegerüst baut, in einem Enum Tokens bzw deren "Namen" speichert und diese erst zur Laufzeit vollständig bekannt sind. Wie sinnvoll der "Sinn" ist, sei mal dahingestellt. Man kann es ja auch anders lösen.

    Da es wohl auch grundsätzlich mit einem zur Laufzeit generierten Code nicht möglich ist, habe ich da wohl einen Denkfehler gemacht.
    Die Idee kam mir recht spontan und ich meinte mich zu erinnern sowas schonmal gesehen zu haben.

    Viele Grüße
    Cherup



  • enums sind Bezeichner für Werte.

    Diese Bezeichner existieren nach dem compilieren nicht mehr. Wie Variablennamen.

    Zur Laufzeit hast du keinen C++-Code mehr.

    Bei enums wird aber der Bereich nicht überprüft. Du kannst also durchaus andere Werte zuweisen. In deinem Beispiel hätte d den Wert 3.



  • Cherup schrieb:

    "Sinn" machts, wenn man z.B. ein allgemeines Codegerüst baut, in einem Enum Tokens bzw deren "Namen" speichert und diese erst zur Laufzeit vollständig bekannt sind.

    Und dann wird durch Magie ein passender case zur Verarbeitung das Tokens eingefügt?



  • Wenn es dabei um eine Schnittstelle zur Kommunikation übers Netzwerk geht, muss nicht zwangsläufig eine passende case-Abfrage in der Schnittstelle stehen.
    Ich habe etwas ähnliches schonmal gebaut.
    Das war eine Netzwerkschnittstelle, an die über eine tube verschiedene Programme angebunden werden konnten. Da die Tokens für die Art der gesendeten Daten beim Erstellen des Interfaces noch nicht vollständig bzw zum Teil gar nicht bekannt waren, wurden unbekannte Tokens an alle Programme, die über eine tube angebunden waren geschickt und das passende Programm hat sich gemeldet und die Daten bekommen.
    Da das die Zeit zum Teil erheblich erhöht hat (lag an den angebunden Programmen) wurde später ein zweites Token mitgeschickt, dass das Programm, für das die Daten bestimmt waren, genannt hat.

    Mithilfe einer dynamischen Enum hätte man die passende tube direkt auswählen können und die Daten verschicken können.

    Das Ganze war eine Schnittstelle für eine Simulation, deren Teile auf mehreren Rechnern liefen.

    Wie gesagt, ich hatte es von vornherein anders gelöst, aber mich hat interessiert ob es nicht doch so möglich gewesen wäre.

    Viele Grüße
    Cherup



  • Das dynamische enum nennt sich int .



  • Ein** enum kann zur Laufzeit nicht erweitert werden, weil ein enum in C++ kein Objekt ist, das zur Laufzeit existiert. Stattdessen ersetzt der Compiler bereits beim Kompilieren alle Elemente Deines enum 's durch die entsprechenden int -Werte. Im Prinzip macht ein enum also nicht anderes, als wenn Du Dir mit #define entsprechende Konstanten als Macros anlegen würdest - nur macht ein enum **das ganze eben in Typ-sicher.

    Was Du haben willst ist wohl eher ein** std::unordered_map<int,std::string> oder std::list<std::string> als ein enum **:)



  • Er möchte auf gar keinen Fall eine std::list.


Anmelden zum Antworten