Template Spezialisierung



  • Hallo!
    Kann jemand ein kurzes Beispiel zur Template Spezialisierung geben? Ich möchte eine Unterscheidung machen, ob der Template-Parameter 10 oder 100 ist. Also einmal für 10 spezialisieren, und einmal für 100. Geht das? Und kann Visual C++ das auch? 🙂



  • Geht das?

    Ja.

    Und kann Visual C++ das auch?

    Im Spezialfall ja. Fall es sich um ein Klassentemplate mit nur einem non-type-Parameter handelt ja.
    Ansonsten musst du einen Workaround benutzen.

    Hier dein Beispiel:

    template <unsigned>
    struct Foo;   
    
    template <>
    struct Foo<10>
    {
    // Spezialisierung für 10
    };
    
    template <>
    struct Foo<100>
    {
    // Spezialisierung für 100
    };
    

    Oder geht es dir um Funktionstemplates?



  • Huhu! Vielen Dank! Das Beispiel war genau was ich suchte, es ging um Klassentemplates. 🙂

    Jetzt hab ich noch ein großes Problem. 😞
    Ich möchte die Zahl mit der das Template instanziiert wird vom User einlesen, also in etwa:

    std::cout << "Geben Sie eine Zahl ein!" << std::endl;
    int i = 0;
    std::cin >> i;
    Foo<i> foo;
    

    Es geht nur, wenn i const ist. Aber dann kann ich die Zahl ja nicht einlesen. 😉
    Gibt es da eine Lösung? 🙄



  • Gibt es da eine Lösung?

    Nein. Alles was mit Templateinstanziierung zu tun hat geschieht zur *compile-Zeit*. Das Einlesen einer Benutzer-Eingabe geschieht aber natürlich zur *Laufzeit*.



  • templates werden zur compile zeit instanziiert.

    ein workaround wäre:

    class Foo
    { ... }
    
    template<int i>
    class realFoo : public Foo
    { ... }
    
    ...
    Foo* p;
    cin>>i;
    switch(i)
    {
    case 1:
    p=new realFoo<1>;
    break;
    case 2:
    p=new realFoo<2>;
    .
    .
    .
    }
    ...
    delete p;
    


  • Sehe ich auch nicht so ganz den sinn....

    Entweder es ist spezialisiert oder nicht 🤡
    Und wenn der Benutzer eine beliebige Zahl eingeben kann.... Wo ist da die Spezialisierung ?!

    Was hast Du denn genau vor ? Vllt. gibt es einen ganz anderen Weg !?


Anmelden zum Antworten