template und spezialisierungen
-
hallo, ich hoffe ihr könnt mir helfen.
ich möchte z.b mit dem nachfolgenden template die vererbung realisieren
class CWinE: public Txx<CWin> { //... }'; class CWinD: public Txx<CWinFrame> //CWinFrame ist abgeleitet von CWin { //... }; //mit dem template hänge ich mich zwischen die klassen template <class BASE> class Txx : public BASE { //... public: bool m_bCreate; };
jetzt mein problem, wie erhalte ich von template den zeiger in der form
Txx<void*>* pPtr; //void* weil ich die darunterligende abgeleitete klasse unbestimt ist, aber die gemeinsame basis-classe ist CWin
und wie greife ich mit dem oben erhaltenen gespeicherten zeiger auf das template zu ?
Txx<void*>* pPtr; pPtr->m_bCreate=true;
für jeden hinweiß bin ich dankbar
volker
-
vdittrich schrieb:
und wie greife ich mit dem oben erhaltenen gespeicherten zeiger auf das template zu ?
Txx<void*>* pPtr; pPtr->m_bCreate=true;
void* ist kein Datentyp, und somit kannst du auch nicht
von void* ableiten. void* ist lediglich ein Zeiger, der auf nichts zeigt,
bzw. nichts gültiges.Devil
-
Txx<void*>* pPtr; pPtr->m_bCreate=true;
das ist richtig, void* ist "nichts" aber denoch ein pointer auf Txx<void*>,
aber ... mein gedanke war,template<> Txx<void*> { Txx<void*>* operator->() //könnte man virtual gestalten { return this; } } Txx<void*>* pPtr; (*pPtr)->m_bCreate=true;
Aber wie komme ich erst mal an einen gültigen pointer ??
-
Du musst eine gemeinsame Basisklasse nehmen und diese dann downcasten
-
Shade Of Mine schrieb:
Du musst eine gemeinsame Basisklasse nehmen und diese dann downcasten
CWin wäre die gemeinsame Basisklasse, aber diese kann ich nicht verändern.
class CWinE: public Txx<CWin> { //... }; class CWinD: public Txx<CWinFrame> //CWinFrame ist abgeleitet von CWin und an CWinFrame kann ich auch nichts verändern !! { //... };
und so will ich mich zwischen meinen und den vorgegeben klassen schieben,
nur ich brauche von Txx einen verwertbaren Typunabhänigen Pointer mit denen ich
auf mein template wieder zugreifen kann.class TAxx { public: virtual HRGN GetClipRgn(ClipInfo* pCI=NULL) = 0; virtual bool IsClipRgn() = 0; //... protected: virtual void ReflexMsgFont() {}; }; template <class BASE> class Txx : public BASE, public TAxx { public: HRGN GetClipRgn(ClipInfo* pCI=NULL); bool IsClipRgn(); private: bool m_bCreate; //... };
oder hast du eine andere Idee, an die ich bis jetzt noch nicht gedacht habe ?