C++ Addresse des Copy oder Cast operators

Ich habe gerade einen Anwendungsfall wo es sehr sehr nützlich wäre sich Adresse des Copy constructors, des Assignment operators oder des Cast operatores zu holen und zu speichern.

Hintergrund: Ich kann Member(Properties) von beliebigen Klassen per Name und ID ansprechen, auslesen und setzen. Da ich dafür intern void* brauche gleichzeitig aber typsicher sein will, brauche ich zusätzlich eine TypeID und über diese kann ich gewisse Daten des members abfragen: Typ, Offset, Name, Größe.
Beim setzen einer Property wäre es unheimlich schön wenn ich dafür den copy constructor verwenden kann. Allerding ist zudem Zeitpunkt(da Runtime) der Typ nicht mehr bekannt also kann ich auch keinen Cpy Ctor direkt aufrufen.

Mein Problem passiert in einer Template Klasse, um es für alle Membertypen zu gewährleisten:

Naiv würde ich folgendes schreiben

template struct SPropertyIDGenerator
{
static (T::*m_pCpyCtor)(const T&amp:wink:; //geht leider
//nicht, da kein
//return wert
//vorhanden ist
… weitere Member
}

und für die Addresse

blubb.m_pCpyCtor = &T::T(const T&amp:wink:;

Ich hab leider das Gefühl das es nur deswegen nicht funktioniert da die „Build-in“ Typen keine wirkliche funktion dafür haben deren Addresse man abfragen kann, da es mit einem Assembler befehl getan ist.
Deswegen denke ich, dass es in der Theorie doch eigentlich funktionieren müsste, wenn ich für die Basis Typen Template Spezialisierungen mache wo ich mir dann keinen Pointer auf die Operatoren merke. Kann das sein? Gibts einen vielleicht „besseren“ weg? Oder kann mir jemand eklären warum das in C++ nicht möglich ist?

Vielen Dank
Steffen

Hallo Steffen,

ich weiss nicht, wie ich zu der Ehre komme, Expertenwissen in C++ weitergeben zu sollen… Gerne für C, C#, Smalltalk, Ruby, Lisp - aber C++ habe aus Prinzip nie gelernt :wink:

Herzlichen Gruß
Claus

ich weiss nicht, wie ich zu der Ehre komme, Expertenwissen in
C++ weitergeben zu sollen… Gerne für C, C#, Smalltalk, Ruby,
Lisp - aber C++ habe aus Prinzip nie gelernt :wink:

Bin neu hier hab einfach nach dem Eingeben der Frage unten die „Experten“ zu C++ etc ausgewählt und abgeschickt. Du scheinst aber in diesen Listen dabei gewesen zu sein.

Gruß Steffen

ich weiss nicht, wie ich zu der Ehre komme, Expertenwissen in
C++ weitergeben zu sollen… Gerne für C, C#, Smalltalk, Ruby,
Lisp - aber C++ habe aus Prinzip nie gelernt :wink:

Ich hab mein Problem gelöst. Da ich nichts gefunden habe wo ich meine Lösung schreiben kann nehme ich mal dich dafür her:

Also braucht man explizit den Copy Konstruktor oder Destruktor bei nur zur Runtime bekannten Typen kann man es folgendermaßen lösen:

Man macht eine Basis Klasse(z.b. CTypeOperator) mit 2 virtuellen Methoden:

„virtual void copy(void* pDestination, const void* pSource) = NULL;“

und

„virtual void Delete(void* pData) = NULL;“

nun schreibt man eine Template Klasse(z.b. CTypedOperator) die davon ableitet und die Funktionen jeweils implementiert also:
(T ist das Template Argument)

virtual void copy(void* pDestination, const void* pSource)
{
*reinterpret_cast(_pDataDest) = T(*reinterpret_cast(_pDataSource));
}

und

virtual void Delete(void* _pData)
{
delete reinterpret_cast(_pData);
}

nun kann man sich irgendwo die Referenzen auf diese Implementationen merken z.b. in einem vector wo der index die TypeID ist, oder z.b. durch:

STypeOperator* complexClassOperator = new STypedOperator();

nun kann man mit diesem Pointer die komplexe Klasse sauber kopieren ohne das der Compiler den Typ kennen muss den man kopieren will.

Gruß Steffen

Guten Morgen -

betreffs Ihrer Anfrage vom 11. des Monats muß ich Ihnen leider mitteilen, daß die Fragestellung meine Kenntnisse übersteigt.

Ich bitte auch um Entschuldigung, daß ich erst jetzt antworte, aber ich war ein paar Tage im „verlängerten Wochenende“, mußte dann erst ein neues Passwort bei „wer-weiß-was“ anfordern, etc. …

Ich hoffe, daß Sie entweder inzwischen von anderer Seite Hilfe für Ihr Problem gefunden haben, bzw. noch finden werden !

Mit herzlichem Gruß - H. Bergmann

>
> Ich habe gerade einen Anwendungsfall wo es
> sehr sehr nützlich wäre, sich Adresse des
> Copy constructors, des Assignment operators
> oder des Cast operatores zu holen und zu speichern.
>
> Hintergrund : …
>
> Vielen Dank - Steffen
>

Tut mir Leid, damit kenne ich mich nicht aus.