kurze Template-Verständnisfrage



  • Hallo,

    ich hab mir das Kapitel Templates von http://www.c-plusplus.net/cms/modules.php?op=modload&name=Downloads&file=index&req=getit&lid=18 durchgelesen und bin auf eine Frage gestoßen, die ich mir auch mit dem Template-Tutorial aus dem Forum nicht beantworten konnte.

    Auf S. 183 (in Adobe S. 195) wird gezeigt, dass auch Templates als Template-Parameter verwendet werden können:

    template <class T, template <class U> class SPEICHER>
    class A {
    SPEICHER<T> speicher;
    ...
    };
    

    Für den SPEICHER Parameter sollen dort die Templates

    template <class T> class Stack { /* ... */ }; // Kellerspeicher
    template <class T> class LListe { /* ... */ }; // Lineare Liste
    

    als Parameter eingesetzt werden können.

    Meine Frage ist nun, wozu bei der Templateklasse A extra der Typparameter U eingeführt werden muss, obwohl dieser sonst nie direkt verwendet wird?

    Bzw. wieso vereinbart man das nicht gleich anders?:

    template <class T>
    class A {
    T speicher;
    ...
    };
    

    Und verwendet es dann so:

    A<Stack<int>> moep;
    

    anstatt

    A<int, Stack> moep;
    

    ?



  • moormaster schrieb:

    Meine Frage ist nun, wozu bei der Templateklasse A extra der Typparameter U eingeführt werden muss, obwohl dieser sonst nie direkt verwendet wird?

    gute frage. muss man auch nicht.

    template <template <typename> class X>
    class Foo
    {
    };
    

    Bzw. wieso vereinbart man das nicht gleich anders?:

    template <class T>
    class A {
    T speicher;
    ...
    };
    

    Und verwendet es dann so:

    A<Stack<int>> moep;
    

    anstatt

    A<int, Stack> moep;
    

    ?

    kommt darauf an, was du tun willst. du kannst z.b. für SPEICHER ein default-template argument angeben, wenn du mit template-templates arbeitest.
    template-templates sind eben ein sprachmittel mehr, das oft ganz hilfreich ist - deine frage liest sich also ein bisschen so wie "warum templates verwenden, wenn man auch ohne programmieren kann?"



  • queer_boy schrieb:

    moormaster schrieb:

    Meine Frage ist nun, wozu bei der Templateklasse A extra der Typparameter U eingeführt werden muss, obwohl dieser sonst nie direkt verwendet wird?

    gute frage. muss man auch nicht.

    template <template <typename> class X>
    class Foo
    {
    };
    

    Also geht es nur darum, eine Art Signatur festzulegen für die Templates, die dort als Parameter akzeptiert werden sollen?

    kommt darauf an, was du tun willst. du kannst z.b. für SPEICHER ein default-template argument angeben, wenn du mit template-templates arbeitest.
    template-templates sind eben ein sprachmittel mehr, das oft ganz hilfreich ist - deine frage liest sich also ein bisschen so wie "warum templates verwenden, wenn man auch ohne programmieren kann?"

    Das bezog sich auch eher auf das Beispiel aus dem PDF... wahrscheinlich ist es nicht das beste, um die Vorteile für den Einsatz von Templates als Parameter zu verdeutlichen. Das wird wohl dann etwas klarer, wenn man das Template A noch etwas modifiziert:

    template <class T, template <class U> class SPEICHER>
    class A {
    SPEICHER<T> speicher;
    SPEICHER<int> speicher2;
    SPEICHER<char> speicher3;
    ...
    };
    

    Dann würde das Template SPEICHER auch wirklich mehrfach mit verschiedenen Templateparametern verwendet werden und somit sieht man auch besser, dass es sich lohnen kann, Templates als Parameter zu verwenden 😃


Anmelden zum Antworten