template vs virtual -- Basis-Klasse für Matrizen
Verfasst: Do Jan 17, 2013 1:54 am
Gleich noch eine Frage heute 
Ich schreibe eine C++ Klassenhierarchie für Matrizen. Dabei habe ich eine Klasse Matrix, die mir sozusagen das Interface definiert, welches eine Matrix haben muss. Dann noch zwei erbende Klassen: ArrayMatrix und PointerMatrix, die beide eine Implementierung der in Matrix definierten Schnittstelle sind. Die eine arbeitet mit Array-Zugriffs-Methoden (also someArray[9]), die andere mit Zeigern. Der Sinn und Unsinn dahinter ist dabei nicht wichtig, es ist eine Übungsaufgabe in einem Fach an der Uni hier. Ziel ist letztendlich, die Implementierungen zu vergleichen (im Blick auf Ausführungsgeschwindigkeit etc).
Zur Schnittstelle: Eine Matrix muss die Addition mit einer weiteren Matrix unterstützen, außerdem die Multiplikation mit einer anderen Matrix und die Multiplikation mit einem Skalar. Und Letzteres ist der Punkt, an dem ich auf Probleme stoße.
Hier erstmal meine bisher so ausgearbeitete Klassen-Deklaration:
Ich denke, was ich mir dabei so grundlegend gedacht habe, dürfte klar ersichtlich sein. An der Stelle, an der ich virtuelle template Methoden haben möchte klappt mir mein Konzept aber zusammen: Das wird nicht unterstützt, und mir ist auch klar und verständlich, warum.
Die Idee dieser Methoden ist die Folgende:
Ich habe eine Matrix, sagen wir mit dem Template Parameter int. Diese Matrix möchte ich nun gerne mit dem Skalar (Integer) 3 als auch mit dem Skalar (Double) 3.3456 multiplizieren können. Deshalb die Verwendung eines weiteren template Parameters. Denn verwende ich T (der Klassen-Template-Parameter), dann würde ich nur Skalare vom Typ Integer verwenden können.
Nun ist mir aber nicht so wirklich klar, wie ich das implementieren soll. Ich habe schon etwas von type erasure gelesen, vermute aber, dass ich das hier nicht anwenden kann, da ich ja eingebauten Typen wie int und double gegenüberstehe.
Ideen? Anregungen?

Ich schreibe eine C++ Klassenhierarchie für Matrizen. Dabei habe ich eine Klasse Matrix, die mir sozusagen das Interface definiert, welches eine Matrix haben muss. Dann noch zwei erbende Klassen: ArrayMatrix und PointerMatrix, die beide eine Implementierung der in Matrix definierten Schnittstelle sind. Die eine arbeitet mit Array-Zugriffs-Methoden (also someArray[9]), die andere mit Zeigern. Der Sinn und Unsinn dahinter ist dabei nicht wichtig, es ist eine Übungsaufgabe in einem Fach an der Uni hier. Ziel ist letztendlich, die Implementierungen zu vergleichen (im Blick auf Ausführungsgeschwindigkeit etc).
Zur Schnittstelle: Eine Matrix muss die Addition mit einer weiteren Matrix unterstützen, außerdem die Multiplikation mit einer anderen Matrix und die Multiplikation mit einem Skalar. Und Letzteres ist der Punkt, an dem ich auf Probleme stoße.
Hier erstmal meine bisher so ausgearbeitete Klassen-Deklaration:
Code: Alles auswählen
namespace matrix
{
template<typename T> class Matrix
{
public:
virtual T & operator()(std::size_t, std::size_t) = 0;
virtual Matrix<T> operator+ (Matrix<T> const &) = 0;
virtual Matrix<T> operator- (Matrix<T> const &) = 0;
virtual Matrix<T> & operator+= (Matrix<T> const &) = 0;
virtual Matrix<T> & operator-= (Matrix<T> const &) = 0;
virtual Matrix<T> operator* (Matrix<T> const &) = 0;
virtual Matrix<T> & operator*= (Matrix<T> const &) = 0;
template<typename X> virtual Matrix<T> operator* (X const &) = 0; /// ------------------ BOOM
template<typename X> virtual Matrix<T> & operator*= (X const &) = 0; /// -------------BANG
template<typename X,T> friend Matrix<T> operator* (X const &, Matrix<T> const &);
template<typename X,T> friend Matrix<T> & operator*= (X const &, Matrix<T> const &);
};
} // namespace matrix
Die Idee dieser Methoden ist die Folgende:
Ich habe eine Matrix, sagen wir mit dem Template Parameter int. Diese Matrix möchte ich nun gerne mit dem Skalar (Integer) 3 als auch mit dem Skalar (Double) 3.3456 multiplizieren können. Deshalb die Verwendung eines weiteren template Parameters. Denn verwende ich T (der Klassen-Template-Parameter), dann würde ich nur Skalare vom Typ Integer verwenden können.
Nun ist mir aber nicht so wirklich klar, wie ich das implementieren soll. Ich habe schon etwas von type erasure gelesen, vermute aber, dass ich das hier nicht anwenden kann, da ich ja eingebauten Typen wie int und double gegenüberstehe.
Ideen? Anregungen?