c++: überschreiben von template-member-Funktion in übergeordneten Klasse
Nehmen wir an, ich habe so eine Struktur der Klassen: Basisklasse Object
, die in einer übergeordneten Klasse Bool
, Int
, Float
, Bytes
und Unicode
Klassen. Ich hatte vor, einige Funktionen wie Bool cast_bool() const
, Int cast_int() const
usw. als virtuelle Funktionen in der Object
Klasse und in allen Kind-Klassen, die ich habe, umgesetzt werden diese Funktionen getrennt.
Scheint es, dass eine bessere Lösung ist die Umsetzung template <typename TYPE> TYPE cast() const
- Funktion statt. Da jedoch C++ verbietet virtual-template-Funktionen, die ich don ' T wissen, wie kann ich diese Aufgabe abzuschließen. Was ich brauche ist template <typename TYPE> TYPE cast() const
für Object
und seine childs. Generische Object::cast<TYPE>() const
wird nur werfen CastError
; dann für jeden Typ, wie Bool
, Int
usw. Ich werde implementieren, die Funktionen wie Bool::cast<Bool>() const
, Int::cast<Bool>() const
usw. Ich bin auch in Planung cast builtin-Objekte, obwohl ich jetzt nur überlastung operator bool() const
, operator signed short() const
usw. Wenn es keine Implementierung, template wechseln müssen, um seine generische form von Object
Klasse, gerade zu werfen ist ein Fehler. Gibt es einen Weg, es zu tun (vielleicht brauche ich, um verwenden einige Muster)? Oder es ist einfacher zu verlassen Funktionen wie Int cast_int() const
? Vielen Dank im Voraus!
- Wenn Ihre Umwandlung von Daten in der base-Klasse, es gibt keinen Grund, warum können Sie nicht fügen Sie ein Vorlagen-member-Funktion auf der gleichen Basis-Klasse. Dann haben die Kind-Klassen aufrufen, die. Oder vielleicht bin ich missunderstanding die Frage.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Fügen Sie eine Zwischenklasse wie im Beispiel unten, oder verwenden Sie einfach
dynamic_cast
ohne template-Methoden.Was du machst klingt nicht wie eine sehr gute Idee, den C++ ist nicht Java oder C#... trotzdem konnte man es so machen:
Können Sie halten eine Reihe von flags
halten und eine
virtual int castable() const
Funktion in jeder dieser Klasse, z.B. IhreInt::castable()
zurückintable | floatable | doublable | stringable
. und Sie müssen eine andere Vorlagen-Karte, die dauert eine Castablity enum-Wert und return-Ziel-Typ in typedef .und eine Globale cast-Funktion
Können Sie eine virtuelle Methode, die einen integer-Wert, statt der Typen zur Kompilierzeit. oder Sie können eine interne Struktur, die zum speichern aller Arten von Objekt-Werte. so etwas wie
boost::any
und Sie können schreiben, eine weitere Spezialisierung im detail-namespace, die sich bekehren werden, dass der interne Typ Zieltyp
Andere alternative, wenn Sie fein mit Laufzeit-casts.
Können Sie erstellen eine Art wrapper für das Objekt.
Nun auf diese Weise können Sie simulieren ein beliebiges Objekt durch den Vergleich el1.GetType() mit el2.GetType(). Wenn es gleich ist, können Sie führen Sie eine statische cast