[C++] Ein Pointer zeigt mal auf KlasseA, KlasseB oder KlasseC

Gast #2562848
Lesenswert?

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
#2562905
Lesenswert?

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.
#2563242
Lesenswert?

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
Gast #2563307
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren