Mr. Miyagi Geschrieben 13. August 2009 Teilen Geschrieben 13. August 2009 (bearbeitet) Tag alle zusammen, erstmal beschreibe ich die aktuelle Situation. Ich bastle zur Zeit einer Klasse, die eine Ini File (oder beliebige txt) einließt, sie dann parst und ihre Werte in eine static std::map schreibt. Nun soll der Benutzer Werte auslesen können, indem er ein Objekt der Klasse erstellt, den Abschnitt und Schlüssel als Parameter einer Funktion übergibt und dann einen Pointer auf den Wert in der static std::map zurück liefert. Genau da liegt das Problem. Jetzt könnte ich für jeden Datentyp eine Funktion schreiben die mir den richtigen Typ zurück liefert das würde die Klasse aber einfach nur unnötig groß machen. Die eleganteste Variante die mir dann dazu eingefallen ist, ist die Benutzung von Templates. Mit Templates will ich zum Beispiel folgenden Funktionsaufruf erreichen. if(cfg.getValue<bool>("WINDOWSETUP","bFullScreen")) { ... } Sollte mir nach Möglichkeit einen Pointer auf den Boolean Wert in der Datenstruktur zurück liefern, tut es aber nicht, weil ein „undefined reference“ Fehler erzeugt wird. Deklariere ich das ganze als Inline Funktion innerhalb der Klasse bläht sich der Code zur Laufzeit extrem auf. Das sagt mir zumindest die Prozessanzeige im Task Manager. Meine Frage also: Wie kann man ein Template in einer Klasse verwenden ohne den Code in den Header zu schreiben und ohne den „undefined reference“ Fehler zu erzeugen ? Danke Schon mal für die Antworten. Bearbeitet 13. August 2009 von Mr. Miyagi Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 14. August 2009 Teilen Geschrieben 14. August 2009 Wie kann man ein Template in einer Klasse verwenden ohne den Code in den Header zu schreiben und ohne den „undefined reference“ Fehler zu erzeugen ? Rein theoretisch könntest du den einzigen bekannten Compiler benutzen, der das export-Schlüsselwort unterstützt. Aber auch das würde das Problem nicht lösen, dass der Code größer wird. Templates müssen für jeden Templateparametertyp einzeln instanziiert werden, daran führt auch mit export kein Weg vorbei. Ist diese Funktion denn sehr groß? Besteht die Möglichkeit, Teile der Funktion, die nicht vom Templateparameter abhängen, in nicht-Templatefunktionen auszulagern? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Mr. Miyagi Geschrieben 14. August 2009 Autor Teilen Geschrieben 14. August 2009 Ist diese Funktion denn sehr groß? Besteht die Möglichkeit, Teile der Funktion, die nicht vom Templateparameter abhängen, in nicht-Templatefunktionen auszulagern? Also eigentlich kann ich den kompletten Code in eine Funktion schreiben. Hab es mal versucht und nun bläht sich das Programm nicht so im Arbeitsspeicher auf. Eigentlich kann ich nur abwägen zwischen einem langsameren Zugriff auf die Daten, dadurch das jedes mal abgefragt wird um welchen Typ es sich handelt, oder einen schnelleren Zugriff dadurch, dass die richtige Funktion je nach Parameter benutzt wird. Nachteil ist, dass ich für jeden Datentyp die Funktion erstellen muss. Denke aber das es einfach nicht anders gehen wird. Sieht dann ungefähr so aus. bla.h class bla { public: template <class T> T getValue(std::string Section, std::string Key) { T TheType; func(TheType,Section,Key); } private: void func(bool TheType,std::string Section,std::string Key); void func(int TheType,std::string Section,std::string Key); ... ... }; bla.cpp void bla::func(bool TheType,std::string Section,std::string Key) { ... } void bla::func(int TheType,std::string Section,std::string Key) { ... } ... ... Der Code benutzt jetzt keine Pointer oder Referenzen. Ist halt nur zur Veranschaulichung. Wenn ich aber so darüber nachdenke, ist das Template in der Form komplett überflüssig. Und eine Möglichkeit der Funktion "func()", einfach T als Parameter zu übergeben, funktioniert ja auch nicht. Ist ja schließlich kein Template. Oder gibt es da einen "Trick" das sowas doch funktioniert ? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 14. August 2009 Teilen Geschrieben 14. August 2009 Also eigentlich kann ich den kompletten Code in eine Funktion schreiben.Nein, das hatte ich nicht gemeint. Du solltest nur den gemeinsamen Teil auslagern. Eigentlich kann ich nur abwägen zwischen einem langsameren Zugriff auf die Daten, dadurch das jedes mal abgefragt wird um welchen Typ es sich handelt, oder einen schnelleren Zugriff dadurch, dass die richtige Funktion je nach Parameter benutzt wird.Ich hoffe, mit dem Abfragen des Typs meinst du nicht die Template-Variante. Template benutzt man, wenn Code für viele unterschiedliche Typen gleich ist. Wenn du sowieso eine Typunterscheidung machen musst, und dann je nach Typ etwas komplett anderes machst, ist die Verwendung vom Templates Unsinn. Das würde aber erklären, warum sich dein Code so aufbläht: Weil dann die Typunterscheidung selbst und die unterschiedliche Behandlung für jeden einzelnen Templatetyp erstelllt werden muss. Wenn diese func-Funktionen also sowieso für jeden Typ komplett anders aussehen, dann benutz dafür bitte keine Templates. Überladung ist dann genau richtig. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Mr. Miyagi Geschrieben 14. August 2009 Autor Teilen Geschrieben 14. August 2009 Das mit dem Überladen war ja meine erste Idee. Nur will ich nicht den gleichen Funktionsnamen mit unterschiedlichen Parametern nutzen, sondern mit den gleichen Funktionsnamen, die gleichen Parameter, nur mit unterschiedlichen Rückgabewerten. Einzige Möglichkeit wäre die Variante, für jeden Datentyp seine eigene Funktion zu schreiben und als Rückgabewert dann den richtigen Wert. Denke es geht auch nicht anders, und wenn dann nur mit aufgeblähtem Code. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.