Hallo,
erstmal vielen Dank für eure raschen und kompetenten Antworten.
Vielleicht habe ich das Problem auch schlecht geschildert:
Ich habe eine abstrakte Basisklasse "Camera", von der konkrete Kameraklassen abgeleitet werden. Camera soll einenen Member "cameraHandle" beinhalten, der aber je nach Teiber ein anderer Datentypen ist. Um mir nun unnötige casterein zu ersparen, würde ich diesen Parameter in der Basisklasse Camera unterbringen und diesen per Template typisieren.
Code: Alles auswählen
template<class T>
class Camera {
private:
T cameraHandle;
//...much more code...
};
Nun kann jede Subklasse den Typen T anders Typisieren, je nachdem welcher Datentyp vom Kameratreiber benötigt wird. Soweit auch kein Problem. Nun wird ein "Camera" Member in die MainWindow Klasse eingefügt:
Code: Alles auswählen
class MainWindow //....etc. {
private:
Camera<T> *camera; //Der benötigte Typ T ist hier noch nicht bekannt!
public:
MainWindow() { //inline der Übersicht zuliebe
//..Auslesen der Konfigurationsdatei
if(neededCamera == kamera1) {
this->camer<int> = new Kamera1(); //T muss int sein
} else if(neededCamera == kamera2) {
this->camaer<HIDS> = new Kamera2();//T muss HIDS sein
}
}
};
Wie hier unschwer zu sehen, kann erst im Konstruktor entschieden werden, welcher Typ T für Camera<T> verwendet wird.
@Christian81
Da müsstest Du dem MainWindow ctor bzw. die Klasse auch als Template bauen.
Was aber total unnötig ist. Das ganze geht viel bequemer komplett ohne Template mit Hilfe einer Factory und einer Basisklasse von der alle Kameras ableiten.
Eine Basisklasse gibt es ja bereits (Camera). Nur sehe ich hier nicht, wie eine Factory das Problem mit dem Template lösen soll. Das Problem besteht doch darin, dass ich bei der deklaration des Basisklassenzeiger nicht weiss, welchen Templateparametertypen er zugewiesen bekommt, sondern erst bei der instanzierung.
@RHBaum
Verwendest du dein Widget jemals mit mehreren Typen im selben binary oder wird dein QMainWindow immer nur mit ein bestimmten T laufen ?
Also unter welchen umstaenden kann sich T aendern, aus sicht der Applikation ?
Je nach Konfiguration wird im Konstruktor entschieden, welcher Kameratyp erzeugt werden soll. Bei jedem Kameratyp kann der Templatetyp anders sein. Das Widget selbst hat damit ja nichts zu tun, sondern nur ein nicht visuelles Objekt, das von Kamera abgeleitet ist.
Das Kameraobjekt stellt quasi nur die Verbindung zwischen Programm und den verschiedenen möglichen Kameratreibern dar.
@franzf
Wenn es dann jetzt WIRKLICH eine template-basierte Lösung sein MUSS, kann man einfach mal einen Blick in boost::any werfen. Ist nicht wirklich viel zu Lesen und zu Verstehen
Vielleicht wäre das ein Weg. Aber diesen würde ich nur sehr ungerne gehen, da ich wirklich nur externe Libs einbinden will, wenn es absolut nicht anders geht.
Das muss doch mit C++ Bordmitteln zu lösen sein!?
Vielen Dank und viele Grüße
hmroessler