Spezialisierung/Ableitung von Templates
-
Hallo,
ich habe eine Frage zur Spezialisierung bzw. zum Ableiten von Template-Klassen.
template <class T> class CMyArray { public: CMyArray(int iSize); CMyArray(const CMyArray&); // ... };Wenn ich zum Beispiel obige allgemeine Array-Template-Klasse habe und möchte für ein bestimmtes T zusätzliche Funktionalität ergänzen (Im konkreten Fall eine oder mehrere Funktionen, die auf alle Elemente des Arrays eine bestimmte Operation anwenden, die eben nur für diesen Typ T sinnvoll ist. Zusätzliche Member soll es nicht geben).
Meine erste Frage wäre, ob man in diesem Fall besser das Template spezialisiert oder ob man besser eine abgeleitete Klasse für dieses bestimmte T implementiert.template <> class CMyArray<MyType> { public: // ... void MySpecialFunction(); };class CMySpecialTypeArray: public CMyArray<MyType> { public: // ... void MySpecialFunction(); };Ich hätte in meinem Fall die Ableitung bevorzugt, allerdings ergeben sich dadurch gleich ein paar weitere Fragen, weil ich mir bezüglich Konstruktion und Typumwandlung in einigen Fällen unsicher bin.
Ein Beispiel:CMySpecialTypeArray a, b; CMySpecialTypeArray c = a + b;Hier wird doch der operator+ von CMyArray<MyType> aufgerufen und der liefert natürlich ein CMyArray<MyType>, das ich wiederum CMySpecialTypeArray nicht zuweisen kann.
error C2440: 'initializing' : cannot convert from 'CMyArray<T>' to 'CMySpecialTypeArray'
1> with
1> [
1> T=MyType
1> ]
1> No constructor could take the source type, or constructor overload resolution was ambiguousReicht es, wenn ich einen Konstruktor und einen Zuweisungsoperator schreibe, die mir aus einem CMyArray<MyType> ein CMySpecialTypeArray machen, oder vergesse ich damit etwas?
Vielen Dank vorab!
-
Also zuerst einmal würde ich die Schnittstelle bei einer Spezialisierung wenn möglich nicht verändern, nur die Funktionalität sollte verändert werden. Es gibt Ausnahmen, allerdings sind die vor allem im Bereich der Templatemetaprogrammierung anzutreffen.
Bei deinem Problem frage ich mich aber, ob es nicht besser wäre eine dritte Möglichkeit in Betracht zu ziehen. Ein Array bietet schliesslich wohl vollen Zugriff auf seine Member. Wieso implementierst du dann nicht diese zusätzlichen Funktionen als freie Funktionen? Wenn du das noch im gleichen Namensraum machst, kannst du dich sogar auf ADL verlassen.
Grüssli
-
Vielen Dank für die Antwort!
Nachdem ich beim Versuch, das über eine abgeleitete Klasse zu machen jetzt schon einige Stolpersteine entdeckt habe, ist die dritte Möglichkeit in meinem Fall vermutlich tatsächlich die beste und vor allem die einfachste.