Klassentemplates spezialisieren



  • Hallo,

    Meine Template-Klasse template <class T> MyClass für T=MyClass anders aufgebaut werden, als für T=MyOtherClass .
    Und zwar soll eine Membervariable je nach Template-Parameter verschiedene Typen erhalten:

    template <class T> MyClass {
        // Standardmäßige Membervariable (also bei T=MyClass)
        int m_object;
    
        // Membervariable bei T=MyOtherClass
        std::list<int> m_object;
    };
    

    Lässt sich das mit C++ realisieren?



  • Ehm.. Du hast ja schon genannt, wie das geht. Mit Spezialisierung. 😉

    class MyOtherClass {};
    
    template <class T> 
    struct MyClass 
    {
        int m_object;
    };
    
    template <> 
    struct MyClass<MyOtherClass>
    {
    	std::list<int> m_object;
    };
    

    Hast du das Wort jetzt einfach so benutzt, oder kanntest du Spezialisierung doch schon?

    Schau mal hier (oder besser in einem guten Buch):
    http://de.wikipedia.org/wiki/Template_(Programmierung)#Spezialisierung



  • Äh...unter der Annahme, dass die Doppelbelegung von MyClass in deinem Beispiel ein Versehen ist - du beschreibst es einmal als Klasse und einmal als Klassenvorlage - klar.

    class my_class { }
    class my_other_class { };
    
    template<typename T> class my_class_template {
      // Hier ggf. für andere Typen implementieren
    };
    
    template<> class my_class_template<my_class> {
      int m_object;
    };
    
    template<> class my_class_template<my_other_class> {
      std::list<int> m_object;
    };
    


  • Danke 🙂
    @drakon: Ich wusste das das bei Funktionen geht, aber nicht, wie das bei Klassen zu funktionieren hat.



  • Hehe. Ich habe das, wenn ich mich richtig erinnere damals zuerst bei Klassen gelernt und dann wurde gesagt, dass das auch bei Funktionen geht. 🙂



  • Bei Klassentemplates geht es sogar besser, weil sich diese auch partiell spezialisieren lassen (bei mehreren Templateparametern spezialisiert man nur einen Teil davon).



  • soll man das nicht auch bei fkt. im kommenden standard machen dürfen?


Anmelden zum Antworten