 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Jan Boehme Guest
|
Posted: Mon Dec 13, 2004 9:36 am Post subject: Derefernzieren von Zeiger auf Template-Objekt |
|
|
Hallo!
Bevor ich all meine Klassen zu Klassenschablonen konvertiere, möchte ich
noch schnell fragen, ob es für den Aufruf von B::Render eine andere
Lösung gibt, als dass B ebenfalls ein template ist. Es wäre nötig, über
B::SetA klassesnweit bekannt zu machen, von welchem Typ T ist.
Gibt es dafür einen Trick/Mechanismus?
Danke, Jan.
template <typename T, int N> struct A
{
void Render() { //... }
};
struct B
{
void *pA;
template <typename T, int N> void SetA(A<T,N> &_a)
{
pA = &_a;
}
int Render()
{
(?CAST?(pA))->Render();
}
};
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Michael Karcher Guest
|
Posted: Tue Dec 14, 2004 12:32 pm Post subject: Re: Derefernzieren von Zeiger auf Template-Objekt |
|
|
Jan Boehme <aiscape (AT) hotmail (DOT) com> wrote:
| Quote: | Bevor ich all meine Klassen zu Klassenschablonen konvertiere, möchte ich
noch schnell fragen, ob es für den Aufruf von B::Render eine andere
Lösung gibt, als dass B ebenfalls ein template ist. Es wäre nötig, über
B::SetA klassesnweit bekannt zu machen, von welchem Typ T ist.
Es ist nicht unbedingt nötig, den konkreten Typ von T zu kennen. Man kann |
hier virtuelle Funktionen und Templates möglicherweise gewinnbringend
kombinieren:
| Quote: | template <typename T, int N> struct A
{
void Render() { //... }
};
|
class Renderable {
public:
virtual void Render() = 0;
};
template <typename T, int N> struct A : public Renderable {
virtual void Render() { /*...*/ }
};
| Quote: | struct B
{
Renderable * pA |
[SetA unverändert]
| Quote: | int Render()
{
pA->Render();
}
};
|
Michael Karcher
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Olaf Krzikalla Guest
|
Posted: Tue Dec 14, 2004 1:28 pm Post subject: Re: Derefernzieren von Zeiger auf Template-Objekt |
|
|
Hi,
Jan Boehme schrieb:
| Quote: | Bevor ich all meine Klassen zu Klassenschablonen konvertiere, möchte ich
noch schnell fragen, ob es für den Aufruf von B::Render eine andere
Lösung gibt, als dass B ebenfalls ein template ist.
Bis hierhin würde ich dem Template A einfach eine Basisklasse mit |
virtueller Render-Methode verpassen. Aber...
| Quote: | Es wäre nötig, über
B::SetA klassesnweit bekannt zu machen, von welchem Typ T ist.
Sieht schlecht aus. Statisch kann das schonmal nicht gehen, da ja zur |
Compilezeit für ein B-Objekt nicht klar ist, ob und wie oft und v.a. mit
welchem T SetA aufgerufen wird. Also mußt Du den Typ dynamisch in pA
verpacken (er bezieht sich dann immer auf den letzten Aufruf von SetA).
Und da kommt es jetzt auf das exakte Problem an, da ja T aus einem void*
auch nicht so einfach wieder rausextrahiert werden kann.
MfG
Olaf Krzikalla
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Martin Kaul Guest
|
Posted: Tue Dec 14, 2004 3:21 pm Post subject: Re: Derefernzieren von Zeiger auf Template-Objekt |
|
|
Jan Boehme wrote:
| Quote: | Hallo!
Bevor ich all meine Klassen zu Klassenschablonen konvertiere, möchte ich
noch schnell fragen, ob es für den Aufruf von B::Render eine andere
Lösung gibt, als dass B ebenfalls ein template ist. Es wäre nötig, über
B::SetA klassesnweit bekannt zu machen, von welchem Typ T ist.
Gibt es dafür einen Trick/Mechanismus?
|
Wie Olaf schon gesagt hat, Basisklasse von A mit virtueller Render
Methode erzeugen.
Allerdings verstehe ich den zweiten Punkt nicht. Warum musst du
klassenweit den Typ von T bekannt machen. Der Pointer pA der Klasse B
sollte ein Pointer auf die Basisklasse sein. Dann wird die korrekte
Render() Methode aufgerufen, d.h. das Wissen, von welchem Typ T konkret
ist, wird nicht benötigt.
tschaule
Martin
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Torsten Robitzki Guest
|
Posted: Tue Dec 14, 2004 5:48 pm Post subject: Re: Derefernzieren von Zeiger auf Template-Objekt |
|
|
Jan Boehme wrote:
| Quote: | Hallo!
Bevor ich all meine Klassen zu Klassenschablonen konvertiere, möchte ich
noch schnell fragen, ob es für den Aufruf von B::Render eine andere
Lösung gibt, als dass B ebenfalls ein template ist. Es wäre nötig, über
B::SetA klassesnweit bekannt zu machen, von welchem Typ T ist.
Gibt es dafür einen Trick/Mechanismus?
|
Du könntest aus pA einen Zeiger auf eine Funktion machen, die bereits
alle Parameter kennt: (habs nicht getestet, das Prinzip sollte klar werden)
| Quote: |
template <typename T, int N> struct A
{
void Render() { //... }
};
|
template <typename T, int N , struct A
void call()
{
a.Render();
}
| Quote: | struct B
{
void (*pA)();
template <typename T, int N> void SetA(A<T,N> &_a)
{
pA = call<T,N,_a>;
}
int Render()
{
pA();
}
};
|
mfg Torsten
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Torsten Robitzki Guest
|
Posted: Tue Dec 14, 2004 6:08 pm Post subject: Re: Derefernzieren von Zeiger auf Template-Objekt |
|
|
Torsten Robitzki wrote:
| Quote: | Jan Boehme wrote:
Hallo!
Bevor ich all meine Klassen zu Klassenschablonen konvertiere, möchte
ich noch schnell fragen, ob es für den Aufruf von B::Render eine
andere Lösung gibt, als dass B ebenfalls ein template ist. Es wäre
nötig, über B::SetA klassesnweit bekannt zu machen, von welchem Typ T
ist.
Gibt es dafür einen Trick/Mechanismus?
Du könntest aus pA einen Zeiger auf eine Funktion machen, die bereits
alle Parameter kennt: (habs nicht getestet, das Prinzip sollte klar werden)
|
Quatsch, vergiss es Die Adresse von struct A<T,N> wird wohl kaum zur
Compilezeit bekannt sein. (es wären also zwei Zeiger nötig)
mfg Torsten
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|