Class Template specialization



  • Wenn ich eine Klasse mit Template habe und möchte nun diese Klasse für bestimmte typen spezialisieren.
    Wie schaffe ich es dann nur bestimmte Methoden zu spezialiseren.

    template<typename T>
    class MyClass<T>
    {
         void DoSomething() {}
         void DoSomeOtherthing()  {}
    }
    
    template<>
    class MyClass<int>
    {
         // void DoSomething(){}  nicht spezialisieren
         void DoSomeOtherthing{} // spezialisieren
    }
    
    void main()
    {
       MyClass<int> a{};
       a.DoSomething()  // ist nicht verfügbar!?
    }
    
    


  • Ohje. Nach dem posten eingefallen.
    Nur Methode spezialisieren nicht ganze Klasse. 😀

    edit:

    Nein geht ja auch nicht da meine Methoden ja nicht direkt ein template definieren sondern nur das von der Klasse verwenden.

    Hilfe!



  • Du kannst mit enable_if die Funktion für bestimmte Typen ändern.

    #include <iostream>
    #include <type_traits>
    
    template<typename T>
    struct MyClass
    {
        template<typename U = T, std::enable_if_t<std::is_same_v<U, int>, void*> = nullptr>
        void DoSomething() { std::cout << "int\n"; }
    
        template<typename U = T, std::enable_if_t<!std::is_same_v<U, int>, void*> = nullptr>
        void DoSomething() { std::cout << "default\n"; }
    
        void DoSomeOtherthing()  {}
    };
    
    int main()
    {
       MyClass<int> a{};
       a.DoSomething();
    
       MyClass<float> b{};
       b.DoSomething();
    }
    

    Oder so:

    void DoSomething() {
        if constexpr(std::is_same_v<int, T>) {
            std::cout << "int\n";
        } else {
            std::cout << "default\n";
        }
    }
    

    Edit: ich habe wohl DoSomething und DoSomeOtherthing vertauscht.



  • Nein, Spezialisierungen sind eigenständige Typen, die funktional in keiner Verbindung zum Basis-Template stehen. Sie erben nichts sondern bieten nur das an, was in der Spezialisierung implementiert ist. Also ist a.DoSomething nicht verfügbar.



  • hi wob.

    danke. Das habe ich in der Zwischenzeit auch raus gefunden.
    template<typename U = T> war der entscheidende Punkt.

    std::enable_if_t<> brauche ich glaube nicht wenn ich T bzw. U in der Signatur verwende und in der Spezialisierung den entsprechenden Typ angebe

    also so:

    template<typename U = T> 
    void DoSomething(U value);
    
    template<> 
    void DoSomething(int value);
    

Anmelden zum Antworten