Templateklasse, Art specialization
-
Hi

Ich habe eine Templateklasse mit einer Vielzahl an Methoden.
Eine Methode allerdings muss bei einigen Typen gänzlich anders implementiert werden.
Wie kann ich das Template spezialisieren, ohne die anderen Funktionen auch alle neu schreiben zu müssen?
Grüße,
Ethon
-
Ethon schrieb:
Ich habe eine Templateklasse mit einer Vielzahl an Methoden.
Was ist denn eine Templateklasse?
Meinst Du ein Klassentemplate oder eine Instanz eines Klassentemplates?Ethon schrieb:
Eine Methode allerdings muss bei einigen Typen gänzlich anders implementiert werden.
Wie kann ich das Template spezialisieren, ohne die anderen Funktionen auch alle neu schreiben zu müssen?
...ist bestimmt möglich... Verhalten lässt sich ja ganz gut mit Funktionsobjekten anpassen. Diese Elementfunktion leitet dann die Arbeit einfach weiter an ein Funktionsobjekt oder an die richtige freie Funktion per Overload-Resolution.
Beispiel (Deleter):
template<class T> struct default_deleter { typedef T* pointer; void operator()(pointer p) const { delete p; } }; template<class T> struct default_deleter<T[]> { typedef T* poitner; void operator()(pointer p) const { delete[] p; } }; template<class T, class Deleter = default_deleter<T> > class unique_ptr { public: typedef typename D::pointer pointer; explicit unique_ptr(pointer p, Deleter d = Deleter()) : p(p), d(d) {} ~unique_ptr() { deleter(p); } ... private: pointer p; Deleter d; };
-
#include <iostream> template<typename T> struct A { void foo() const { std::cout << "foo" << std::endl; } }; // Wichtig: Das hier ggf. auch mit im Header template<> void A<int>::foo() const { std::cout << "bar" << std::endl; } int main() { A<double> ad; A<int> ai; ad.foo(); ai.foo(); }Im Übrigen handelt es sich dabei um eine Klassentemplate bzw. Klassenvorlage, nicht um eine Templateklasse. Es ist eine Vorlage für Klassen, aber selbst keine Klasse.
-
Wobei das nur geht wenn man vollständig spezialisiert.
Funktionsobjekte wurden ja schon genannt.
Dann kann man noch Hilfs-Llassen-Templates mit statischen Memberfunktionen verwenden.
Und natürlich kann man ein Klassen-Template von einem anderen ableiten, und beide unterschiedliche spezialisieren.
In Verbindung mit dem CRTP kann man damit auch oft gut arbeiten.