Zum Inhalt springen

Elegante Lösung um Template Funktion in einer Klasse zu nutzen


Mr. Miyagi

Empfohlene Beiträge

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 von Mr. Miyagi
Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 ?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...