[gelöst] template basiertes data loading denkanstoß
-
Hallo,
ich möchte gerne über eine statische Klasse eine schnittstelle zu allerlei Datntypen bereitstellen, die anhand von encodings in die entsprechenden objekte aus dem bytecode einer datei oder eines streams erzeugt werden.
dazu habe ich in der statischen klasse eine methode definiert
template<typename T> T Load(std::string name);über welche ich verschiedenen datentypen anbieten möchte und die der anwender um neue typen (anhand von spezialisation) erweitern kann.
(es macht beispielsweise keinen sinn ein txt file in ein int pressen zu wollen, daher ist Load<int> nicht definiert und führt zu compiler fehlern)
Dann habe ich auch noch eine map angelegt, in der ich verschiedene encoder anhand der dateiendung benutzen möchte.
std::map<std::string, encoder> encodings;Das Ganze klappt wunderbar solange ich nicht versuchen einen typ über mehrere encoder zu verteilen, da sich der compiler dann beschwert, die spezialisierung würde bereits existieren.
ich brauche nun einen Denkanstoß, wie ich es hinbekommen kann, dass ich über die Load<T> methode trotzdem das gleiche T aus mehreren encodings erhalten kann.
beispiel zur veranschaulichung
//same encoder diferent encodings std::string text = Load<std::string>("MyFile.xml"); Xml xml = Load<Xml>("MyFile.xml"); //same encoding diferent encoders std::string xml = Load<std::string>("MyFile.xml"); std::string text = Load<std::string>("MyFile.txt");(über den sinn und zweck dieses beispielcodes soll hier nicht diskutiert werden!)
Ich würde auch gerne bei den templates bleiben weil ich sonst für jeden Typ eine eigene funktion schreiben müsste und somit die erweiterbarkeit abhanden kommt.
auch das beispiel
class X { public: X(); template<typename T> T Get() { return _getT(); } protected: int _getT() { return 0; } float _getT() { return 0.5f; } }; main() { X x = X(); int i = Get(); int f = Get(); }bringt hier nichts, da hier wieder alle typen zur compilezeit bekannt sein müssen und die erweiterbarkeit somit nicht gegeben ist.
Danke schonmal für eure Tipps!
-
template <class Encoding, class Encoder> Encoding Load(const string &path){ return Encoder<Encoding>().parse(path); }
-
//same encoder diferent encodings std::string text = Load<std::string>("MyFile.xml"); Xml xml = Load<Xml>("MyFile.xml"); //same encoding diferent encoders std::string xml = Load<std::string>("MyFile.xml"); std::string text = Load<std::string>("MyFile.txt");Rueckgabetypen sind nicht Teil der Signatur. Du kannst Traits benutzen, Rueckgabetyp in Spezialisierung einarbeiten oder Strategiepattern benutzen.
PS: Da du meist einfach verschwindest, wenig kontext lieferst und ich dich fuer blurry halte, fallen meine Antworten spaerlich aus.
-
knivil schrieb:
Rueckgabetypen sind nicht Teil der Signatur. Du kannst Traits benutzen, Rueckgabetyp in Spezialisierung einarbeiten oder Strategiepattern benutzen.
OK, werde ich mich mal reinarbeiten.
[Offtopic]
knivil schrieb:
da du meist einfach verschwindest
nun ja, seid ihr doch mitunter auch selber schuld. Wie oft hat man mir schon sinngemäß gesagt "das was du da machst klappt eh nicht" oder "du bist ja eh n noob" oder "lass es, das was du vorhast ist der letzte scheiß"
und dann könnt ihr mich auch ganz ehrlich mal, ok, mag sein, dass ich noch nicht die Erfahrung habe, die andere haben oder die andere vorraussetzen (ich weiß ja nicht ob man neuerdings einen kompetenz test ablegen muss um überhaupt in ein forum zu posten) aber
1. hab ich genug grips um als entwickler zu arbeiten und
2. brauch ich mir nich sagen zu lassen "ja das hast du so und so zu machen alles andere ist falsch"so und wenn das mein Lösungsansatz ist und einige der Meinung sind das mit einem "*lach*" kommentieren zu müssen kann ich auch nichts dafür aber ein bischen etikette und anstand kann man ja wohl erwarten, zudem wenns funktioniert, was störts euch?
knivil schrieb:
wenig kontext lieferst
mitunter siehe meine argumentation oben
knivil schrieb:
ich dich fuer blurry halte, fallen meine Antworten spaerlich aus.
Ich weiß nicht wer oder was dieser blurry sein soll, aber ich bins definitiv nicht!
Ich hab mal gesucht nach blurry (war hoffentlich richtig)
http://www.c-plusplus.net/forum/u115120
Anmeldungsdatum: 23.01.2010und dahingegen mein Profil
http://www.c-plusplus.net/forum/u111259
Anmeldungsdatum: 10.12.2008und nur weil ich keine Privatinformationen drinn habe, heißt das noch lange nicht, dass ich irgendein fake profil benutze.
-
Ich nehme mal an, das Stichwort, das du suchst, ist Serialisierung. Dafuer gibts schon unzaehlige Bibliotheken, z.B. boost.serialization: http://www.boost.org/doc/libs/1_54_0/libs/serialization/doc/index.html
-
Leider ist es nicht so einfach und es handelt sich dabei tatsächlich um eine Klasse um zu Verarbeiten, nicht zu serialisieren, also aus einem Xml-File beispielsweise ein Xml Objekt zu parsen etc. eben anhand der verschiedenen encodings je nach dateiendung und das so gestrickt, dass der anwender dem System sagen kann was er gerne für ein objekt hätte (sofern diese verwandt sind natürlich). Darüber hianus muss der Anwender zusätzlich neue encodings registrieren können.
[Gelöst]
So leute, vielen Dank für die zwar spärliche aber im endeffekt trotzdem gute Hilfe.
Ich habe mein System jetzt so umgebaut, dass ich einen neuen typ objekt erzeugt habe und diesen jetzt als rückgabetyp verwende. Meine struct objekt ist dabei so ähnlich aufgebaut wie boost::any und kann somit jeden typen zurückgeben.