[Templates] Enummeration zur Compilezeit



  • Hallo zusammen,

    ist es möglich zur Compilezeit Typen zu enummerieren. Also etwas in der Art

    class A
    {
    ...
    const int ID = calculate<...>::ID // gibt zum Beispiel 0
    
    };
    
    class B
    {
    ...
    const int ID = calculate<...>::ID // gibt dann 1
    ...
    };
    
    usw.
    

    Mein Problem ist dass ich mir keinen Startwert basteln kann, den ich zum enummeriern hernehmen kann.

    Vielleicht hat ja von euch einer ne Idee, wie man das bewerkstelligen könnte. Ich hab mitlerweile die dumpfe Befürchtung, dass es gar nicht geht...

    Gruß
    Tobi



  • Wozu soll das zur Compilezeit gemacht werden? Reicht es nicht, wenn die Konstanten bei der Instanziierung bestimmt werden?
    Zum Problem:
    Ich glaube nicht, dass das geht. Man kann bei der Metaprogrammierung meines Wissens zwar Abbruchbedingungen vorgehen, und dann irgendwelchen Code rekursiv generieren, aber umgekehrt geht das eher nicht.



  • Naja, die ID für Messages soll für eine Zuordungstabelle zur Compilezeit bestimmt werden, da sich der Programmierer der die Message definiert und verwendet um die ID nicht kümmern soll.

    Die Codeerzeugung für die Initalisierung zum Startup hab ich schon, aber ich wollte halt wissen, ob man dass auch komplett zur Compilezeit hinbekommt.

    Gruß
    Tobi



  • Tobias Gerg schrieb:

    Naja, die ID für Messages soll für eine Zuordungstabelle zur Compilezeit bestimmt werden, da sich der Programmierer der die Message definiert und verwendet um die ID nicht kümmern soll.

    Die Codeerzeugung für die Initalisierung zum Startup hab ich schon, aber ich wollte halt wissen, ob man dass auch komplett zur Compilezeit hinbekommt.

    Gruß
    Tobi

    Muss er doch auch nicht, wenn es eine Funktion wäre:

    const int ID = calculate<...>::ID();
    

    Der Programmierer muss nur () zu dem von Dir gegebenen Code dazuschreiben. Die IDs werden intern irgendwie generiert.
    Ich sehe den Sinn, das zur Compilezeit zu machen immer noch nicht.


Anmelden zum Antworten