Templates
-
Hallo!
Ich habe eine Template-Klasse A<T> erstellt und möchte nun in einer Liste Objekte verschiedener Datentypen gemeinsam verwalten.
Folgender Code kompiliert jedoch nicht, da der Datentyp, den die Liste verwalten soll schon bekannt sein soll. Hat irgendwer eine Idee wie man das lösen kann?
template<typename T> class A { public: A(){ } A(T t) : data(t) { } ~A() { } void doSomething() { } T get() { return data; } private: T data; }; int main(int argc, char* argv[]) { A<int> a(1); A<float> f(1.0f); A<bool> b(false); std::list<A&> list; list.push_back(a); list.push_back(f); list.push_back(b); }
-
Die Typen A<int> und A<bool> haben nichts miteinander zu tun. Und A alleine geht gar nicht (und hätte auch wieder nichts mit A<int> und so zu tun). Und Referenzen kannst Du in keinen Container stopfen.
-
Grundlegend: A ist keine Template-Klasse, sondern eine Klassen-Template bzw. Klassenvorlage. Es handelt sich also nicht um einen Typen, sondern um eine Schablone, aus der der Compiler nach Bedarf Typen erzeugen kann.
Was genau hast du eigentlich vor? Außerhalb von Sprachinterpretern o.ä. kann man sich die elende Fummelei, in die man mit Laufzeittypverwaltung unweigerlich läuft, mit etwas Überlegung in aller Regel sparen. Wenn du wirklich Werte hast, deren Typ erst zur Laufzeit feststeht, sind Boost.Variant und Boost.Any einen Blick wert.
-
Ich weiß jetzt nicht genau, was du erreichen willst. Hast du schon mal etwas von Polymorphie gehört?
-
Leite deine Templates von einer Nicht-Template-Klasse ab und packe diese in die Liste.
Gruß