Template Spezialisierung für const



  • Hallo,

    ich möchte für ein Template eine Spezialisierung für den Fall,
    dass ein const-Parameter übergeben wird.
    Dabei möchte ich jedoch nicht für einen bestimmten Typen spezialisieren,
    sondern generell (std::list, std::vector, ...)

    Ist sowas möglich?

    Wenn ja, wie?

    Hier ist in etwa der Code wie ich es mir gedacht habe...
    Natürlich funkt es so nicht, sonst bräuchte ich ja nicht fragen 🤡

    #include <iostream>
    #include <string>
    template<typename T>
    class Foo{
    public:
            Foo(T& t){
                    std::cout << "no const" << std::endl;
            }
    };
    
    template<>
    class Foo<const typename T>{
    public:
            Foo(const T& f){
                    std::cout << "const" << std::endl;
            }
    };
    
    int main(int argc, char** arg) {
            std::string s;
            Foo<std::string> foo1(s); // no const
            Foo<const std::string> foo2(s); // const
            return 0;
    }
    

    Gruß,
    Mark



  • Stichwort partielle Spezialisierung:

    template <class T>
    class Foo {/* Normalfall */};
    
    template <class T>
    class Foo<T const> { /* const-Spezialfall*/ };
    

    http://ideone.com/Qnrd6



  • Danke



  • Hat es einen Grund, warum du das typename in class geändert hast?



  • Es ist kürzer 😉

    An dieser Stelle sind class und typename gleichbedeutend. Es lässt sich also nur mit Geschmack begründen.



  • Es ist nicht immer egal, ob typename oder class, es gibt Fälle, die zwar praktisch kaum vorkommen, in denen man class verwenden muss, nämlich bei template-template Parametern, template-template-template-Parametern, usw...:

    template
    <
        template <typename> class T // Hier muss class stehen
    >
    ...
    

    Ich persönlich verwende immer typename, da es für mich die Intention besser ausdrück, einen Typen haben zu wollen. Kürze des Codes empfinde ich nicht als Argument, ein Code sollte gut lesbar sein und nicht kurz. Da stören mich die paar Buchstaben nicht.


Anmelden zum Antworten