Template Funktion nach Argument spezialisieren
-
Hi,
ich hab ein Klassen Template und will nun eine Funktion darin nach einem enum Arguement spezialisieren. Kann mir jemand mal ein Beispiel geben wie das aussehen müsste? Wäre sehr nett, weil ich bekomms nicht hin
-
also als beispiel nehme ich mal ein int:
template< int T > class C { // hier z.B. eine spezialisierte Funktion für int = 1 }
-
template <int T> class CBase { // Alle Funktionen, die alle Spezialisierungen gemeinsam haben sollen. }; template <int T> class C : public CBase<T> { // Alle Funktionen, die nur unspezialisierte Varianten von C haben sollen. }; template <> class C<0> { // Alle Funktionen, die nur für T = 0 exisitieren sollen. };
-
Ja das ist tatsächlich ne Variante. Aber geht das nicht auch einfacher? So dass ich nur eine Klasse habe. Oder reichen dafür die C++ Features mal wieder nicht

-
higs schrieb:
Oder reichen dafür die C++ Features mal wieder nicht

Jop. Du kannst nur Templates spezialisieren. Aber die Klasse ist ein Template, nicht die Methode.

Andererseits. Vielleicht kannste was mit std::enable_if basteln.
-
Mit std::enable_if (-> Gibt aber nicht so schöne Fehlermeldungen
)#include <type_traits> // C++11 für std::enable_if. Alternative: boost::enable_if tempate <int T> class C { // Methode, die nur für T = 0 existieren soll // Late sollte nicht vom User verändert werden. template <bool Late = true, typename = typename std::enable_if<Late && T == 0>::type> void foo() { // Implementation von foo. } };
-
Danke für eure Hilfe,
ich hab nun doch die erste Variante genommen da sie mir am verständlichsten erscheint und nicht so viel auf anderes verweist :P.
Und bin natürlich direkt mal auf ein weiteres Problem gestoßen:
Alle Klassen sind in einer Header.
Die Spezialisierten Klassentemplates referenzieren sich gegenseitig, also zyklisch um genau zu sein.
Problem ist, dass nun die erste Klasse die unspezialisierte Variante nimmt und daraus eine Klasse baut, was ja auch logisch ist da zu dem Zeitpunkt nur die unspezialisierte zur verfügung steht. Kann man das nun irgendwie "forwarden", dass er wartet bis die spezialisierte da ist?