Forum: PC-Programmierung [C++] Ein Pointer zeigt mal auf KlasseA, KlasseB oder KlasseC


von Thomas (Gast)


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

von Εrnst B. (ernst)


Lesenswert?

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.

von Karl H. (kbuchegg)


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.

von Klaus W. (mfgkw)


Lesenswert?

Oder einfacher: man übergibt dem template zwei Argumente: erstens int, 
float etc., zweitens KlasseA oder KlasseB...

von Rolf M. (rmagnus)


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

von Karl H. (kbuchegg)


Lesenswert?

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.

von jgdo (Gast)


Lesenswert?

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 -

von Florian (Gast)


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.

von jgdo (Gast)


Lesenswert?

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 -

von Florian (Gast)


Lesenswert?

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.

von Mark B. (markbrandis)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Jetzt hab ich endlich mal verstanden

Hmmm... ich bin noch nicht ganz fertig mit dem Verstehen ;-)

von Thomas (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.