GilbertDur hat geschrieben:Ich habe keine Lösung für dein Problem,
Ich habe jetzt eine Lösung mit der ich noch nicht zufrieden bin:
Code: Alles auswählen
class Base
{
public:
int a;
};
class Derived : public Base
{
public:
int b;
};
class Wrapper
{
public:
Derived derived;
};
void targetfunc( Base Wrapper::*memptr )
{
// nothing to do
}
template< typename T, typename U >
void func( T U::*memptr )
{
targetfunc( reinterpret_cast< Base U::* >( memptr ));
}
int main( void )
{
Derived Wrapper::*wd = &Wrapper::derived;
func( &Wrapper::derived );
return 0;
}
Der reinterpret_cast erscheint mir noch nicht wirklich notwendig... der Compiler sieht das anders, also gut. Um den Memberpointer in eine andere Funktion zu bekommen, brauche ich nun das Template, was ich eigentlich auch eher unschön finde, was mir aber abnimmt, beim Aufruf von targetfunc den reinterpret_cast in den Funktionsaufruf zu packen.
GilbertDur hat geschrieben:
aber mal eine Frage zum Code. Ich habe das Konstrukt nämlich so noch nie gesehen.
Was genau sagt die Zeile aus? Dass das, worauf *wd zeigt, zwingend ein Derived in der Wrapper-Klasse sein muss?
Richtig.
Ein Derived in einer beliebigen Instanz einer Wrapper-Klasse um genau zu sein.
Das ist ein Methoden-, bzw. in dem Fall ein Memberpointer. Du zeigst nicht auf ein Derived, sondern auf die Position eines Derived innerhalb eines Wrapperobjekts. Der Pointer alleine zeigt also nur in Verbindung mit einem Wrapperobjekt auf etwas sinnvolles, entsprechend muss beides kombiniert werden.
Code: Alles auswählen
Wrapper w;
Wrapper pw = &w;
Derived d = w.*wd;
d = pw->*wd;
Ich glaube, Methoden- und Memberpointer sind im Tutorial noch nicht drin und auch eher seltene Kost bei C++-Tutorials. Das ist auch eher etwas exotisches, aber es zeigt eben auch, was man mit C++ alles ausdrücken machen kann, auch wenn ich mit der Konvertierung von (Derived Wrapper::*) nach (Base Wrapper::*) anscheinend an die Grenzen von C++ stoße und mich mit reinterpret_cast<> darüber hinweg setzen muss.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.