Template mit zwei Funktionen?



  • Hey liebe Community,

    wie bezeichnet man dieses Syntax?

    template <typename1 typename2>
    static constexpr transition to(uint8_t actor, uint8_t info){
        return transition{actor,info};
    }
    
    // Using
    namespace::transition<typename1_state>::to<typename2_state>(actor_var,info_var);
    

    Mir ist es neu bei der Funktion Spaces einzubauen? Ich vermute, dass es das erst >C++11 gibt? Kann mir jemand ein Stichwort geben, das mir einen Ansatz gibt mich weiter zu informieren?`

    Danke Euch!


  • Mod

    Wenn da wo jetzt transition steht, stattdessen int stünde, würdest du den Code dann verstehen?



  • Du meinst das Leerzeichen zwischen dem Typ des Rückgabewertes (transition) und dem Funktionsnamen (to)?

    Das ganze wäre auch wahrscheinlich leichter zu verstehen wenn du das äussere Klassentemplate transition nicht unterschlagen würdest. Und nicht versuchen würdest Code zu "anonymisieren" indem du bestimmte Dinge ersetzt (typename1 typename2).



  • ja, das stimmt. Das äußere Klassentemplate:

    template <typename id>
    class transition
    { 
     ...
    

    habe ich unterschlagen. Anonymisiert habe ich, um das Problem schnell erfassen zu können. Gibt es einen Namen für diese Art der "verschachtelten" templates?
    Ist das dann eine Art constructor mit member aufruf?
    Vielen Dank schonmal



  • @hustbaer Gibt es einen Namen für dieses Konstrukt, wo kann ich mich dazu informieren?



  • Das ist einfach nur eine statische Klassenfunktion, welche ein Klassenobjekt zurückgibt (manchmal auch "creator function" genannt), nur daß sowohl die Klasse selbst als auch die Funktion ein Template ist.

    Beim Aufruf hast du noch den Rückgabewert vergessen:

    auto new_transition = Namespace::transition<typename1_state>::to<typename2_state>(actor_var,info_var);
    

    (sonst würdest du nur ein temporäres Objekt erzeugen, das gleich danach wieder verworfen wird)

    PS: In deinem Code sieht man jedoch nicht, warum überhaupt Templates hier nötig sind, da die Template-Parameter nicht verwendet werden. Vllt. solltest du uns doch mal die Original-Funktion zeigen?



  • @Alexandrus sagte in Template mit zwei Funktionen?:

    @hustbaer Gibt es einen Namen für dieses Konstrukt, wo kann ich mich dazu informieren?

    Das ist einfach ein Funktions-Template das ein statisches Member eines Klassen-Templates ist.
    Klassen Template:

    template <class T>
    class Foo {
        // ...
    };
    

    Funktions-Template:

    template <class U>
    ReturnType bar(ArgumentType arg) {
        // ...
    }
    

    Kombiniert: Funktions-Template in Klassen-Template:

    template <class T>
    class Foo {
    public:
        template <class U>
        ReturnType bar(ArgumentType arg) {
            // ...
        }
    
        // ...
    };
    

    Und wenn du dann noch static vor das ReturnType bar... schreibst wird es halt ne statische Memberfunktion.


Anmelden zum Antworten