template mit aufsteigender Parameterliste



  • Hallo

    ich hätte da mal wieder eine Frage zu Templates und zwar diesmal zur Parameterliste. Ich habe eine Klasse definiert, die ein Template vorraussetzt

    template<typename T>
    class foo
    {};
    

    und wollte dazu dann Erweiterungen der Parameterliste definieren, also

    template<typename T1, typename T2>
    class foo
    {};
    

    doch das funktioniert nicht weil er sich entweder beschwert, es gäbe dieses template bereits, oder die argumentliste wäre zu lang



  • funktioniert alleine die definition nicht? das würde mich wundern.

    wenn du im laufenden projekt die parameterliste änderst, klar kommen dann fehler, denn deine nutzenden objekte dieser klasse geben die typen ja nicht an (und herleiten können sie diese offensichtlich auch nicht/kaum)

    aber zeig uns mal die genaue fehlermeldung



  • Was willst du machen?
    Wenn es zwei unabhängige Klassen sind, dann wären die Namen foo1 und foo2 angebracht.
    Wenn foo1 ein Spezialfall von foo2 ist, dann soll das auch so herüberkommen.

    1. Möglichkeit: Default-Parameter

    template<typename T1, typename T2 = int> // oder was auch immer
    class foo
    {};
    
    foo<char> f; // T2=int
    

    2. Möglichkeit: Spezialisierung

    template<typename T1, typename T2=void>
    class foo
    {};
    template<typename T1>
    class foo<T1, void> // void ist sonst sinnlos
    {};
    
    foo<char> f; // Spezialisierung wird genommen
    


  • es ist jedes mal dieselbe klasse, jedoch habe ich mehrere sich wiederholende Sonderfälle mit bis zu 8 Parametern.

    Also habe ich das richtig verstanden, ich kann schreiben

    template<typename T1=void, typename T2=void, typename T3=void>
    class foo
    {};
    
    template<typename T1>
    class foo<T1, void, void>
    {};
    
    template<>
    class foo<void, void, void>
    {};
    

    und dann trotzdem jede Speziealisierung aufrufen, auch ohne jedes mal void void zu schreiben?

    foo<int> f1;
    foo<string,int> f2
    foo<> f3;
    


  • und dann trotzdem jede Speziealisierung aufrufen, auch ohne jedes mal void void zu schreiben?

    Just try it!



  • OK, hat funktioniert, zumindest für die Standardparameter.
    Gibt es auch eine Templateeigenschaft für __stdcall ?


Anmelden zum Antworten