Hallo. Ich möchte mir gerne einen Pointer (innerhalb einer Template-Klasse) definieren, der in Abhängigkeit der Instanziierung der Template-Klasse/Typ mal auf eine KlasseA, KlasseB oder Klasse C zeigt. Bedingung: Der Name dieses Pointers MUSS dabei immer gleich lauten! Beispiel: TemplateKlasse<int>() --> jetzt soll mit KlasseA gearbeitet werden, in allen Funktionen der Template-Klasse TemplateKlasse<float>() --> jetzt soll mit KlasseB gearbeitet werden TemplateKlasse<double>() --> jetzt mit KlasseC Vielen Dank schon einmal im Voraus! Thomas
Thomas schrieb: > Bedingung: Der Name dieses Pointers MUSS dabei immer gleich lauten! Wo ist das Problem? Das geht garnicht anders. Den Pointer einfach als "TemplateArgument * meinName" deklarieren, dann heist der immer meinName, egal ob es anschliessend ein int*, ein float* oder ein double* ist.
Ich bin mir nicht 100% sicher (Templates sind meine schwache Seite), aber ich denke, das wonach du suchst, ist eine "Template Spezialisierung". D.h. man kann Templates für bestimmte Datentypen extra implementieren. Template<int arg> class Myclass { .... KlasseA* pointer_; ... }; Template<float arg> class Myclass { .... KlasseB* pointer_; ... }; Template<double arg> class Myclass { .... KlasseC* pointer_; ... }; (So ungefähr, die Details weiß ich auch nicht mehr auswendig.
Oder einfacher: man übergibt dem template zwei Argumente: erstens int, float etc., zweitens KlasseA oder KlasseB...
Karl Heinz Buchegger schrieb: > Ich bin mir nicht 100% sicher (Templates sind meine schwache Seite), > aber ich denke, das wonach du suchst, ist eine "Template > Spezialisierung". D.h. man kann Templates für bestimmte Datentypen extra > implementieren. Das Problem dabei ist, daß man die Klasse dann immer komplett spezialisieren muß. Ein einzelnes Member geht nicht. Die Lösung sind type traits:
1 | template<typename T> class MyTraits {}; |
2 | template<> class MyTraits<int> { typedef KlasseA type; }; |
3 | template<> class MyTraits<float> { typedef KlasseB type; }; |
4 | template<> class MyTraits<double> { typedef KlasseC type; }; |
5 | |
6 | template<typename T> |
7 | class MyClass |
8 | {
|
9 | ....
|
10 | MyTraits<T>::type* pointer_; |
11 | |
12 | ...
|
13 | };
|
14 | |
15 | MyClass<float> foo; // hier ist foo::pointer_ ein Zeiger auf KlasseB |
Rolf Magnus schrieb: > Das Problem dabei ist, daß man die Klasse dann immer komplett > spezialisieren muß. Ein einzelnes Member geht nicht. Die Lösung sind > type traits: Hey. Das ist ja cool. Jetzt hab ich endlich mal verstanden, was es damit auf sich hat. Danke schön.
Hallo, es wäre noch erwähnenswert, dass in MyClass<T> vor MyTraits<T>::type* pointer_; noch ein 'typemame' geschrieben werden muss, da ansonsten zumindest der g++ denkt, dass MyTraits<T> eine Eltern-Klasse von MyClass<T> ist und rummeckert, dass es keine ist. - jgdo -
jgdo schrieb: > es wäre noch erwähnenswert, dass in MyClass<T> vor MyTraits<T>::type* > pointer_; noch ein 'typemame' geschrieben werden muss, da ansonsten > zumindest der g++ denkt, dass MyTraits<T> eine Eltern-Klasse von > MyClass<T> ist und rummeckert, dass es keine ist. Ja, muß auch, weil qualified dependent name. Templates in C++ sind aber eh schwarze Magie. Das Josuttis/Vandevoort-Buch ist cool, macht aber auch Angst.
Florian schrieb: > Das > Josuttis/Vandevoort-Buch Welches Buch genau meinst Du? Hab "C++ Templates: The Complete Guide" von Josuttis gefunden, aber nichts von Vandevoort. - jgdo -
jgdo schrieb: > Florian schrieb: >> Das >> Josuttis/Vandevoort-Buch > > Welches Buch genau meinst Du? Hab "C++ Templates: The Complete Guide" > von Josuttis gefunden, aber nichts von Vandevoort. > > - jgdo - Vandevoort ist Koautor.
Karl Heinz Buchegger schrieb: > Jetzt hab ich endlich mal verstanden Hmmm... ich bin noch nicht ganz fertig mit dem Verstehen ;-)
Vielen herzlichen Dank. Der Tipp mit den "type traits" hat zum Erfolg geführt. Echt super Sache. Habe wirklich was dazugelernt... Viele Grüße, Thomas.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.