Entwickler-Ecke

Off Topic - [C++] Deklaration von Template-Funktionen


Jakob_Ullmann - Di 22.06.10 15:52
Titel: [C++] Deklaration von Template-Funktionen
Hi!

Ich arbeite gerade an einem kleinen BASIC-Interpreter als Übungsprogramm in C++. Im Modul varmanag.cc ist folgende Template-Funktion definiert:


Quelltext
1:
2:
3:
4:
5:
6:
7:
template <class T>
T Variables::getVar(char *varname)
{
  for (short i = 0; i <= 255; ++i)
    if (!strcmp(varname, varnames[i]))
      return *(reinterpret_cast<T*>(varlink[i]));
}


Wie deklariere ich diese Funktion als Teil der Klasse Variables in der varmanag.h?


Th69 - Mi 23.06.10 15:30

So wie bei der Definition auch:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
class Variables
{
    template <class T>
    T getVar(char *varname);

    // besser ist hier übrigens "const char *" und die Methode als const zu deklarieren, also
    template <class T>
    T getVar(const char *varname) const;
}

Beachte nur, daß du die Template-Funktionsdefinition auch im Header schreiben mußt, falls du diese Klasse im Header (z.B. "Variables.h") deklariert hast.
Der übliche Weg dazu ist, eine eigene "Variables.inl" o.ä. einzubinden:

Quelltext
1:
2:
// unten im Header
#include "Variables.inl"

Dort definierst du dann die Templatefunktion aus deinem Beitrag.

Ganz sauber ist deine Funktion jedoch nicht (wegen dem reinterpret_cast), da kann ja dann jeder Müll rauskommen.
Besser wäre es, du spezialisierst die Funktion für konkrete Datentypen (int, std::string, float, ...).


Jakob_Ullmann - Mi 23.06.10 19:40

Ich dachte immer, man macht die Deklaration in der Header-Datei (.h) und die Definition in der Source-Datei (.cc)? Was soll dann in die Variables.inl?


Th69 - Do 24.06.10 10:23

Templates sind aber nur Vorlagen, d.h. diese müssen jeder Source-Datei beim Einbinden zur Verfügung stehen (und damit man aber trotzdem Deklaration und Definition trennt, benutzt man dafür dann eine weitere Datei (und nennt sie dann z.B. ".inl" ('inline')).

Sieh dir auch mal folgenden FAQ-Beitrag in dem C++ Forum an: http://www.c-plusplus.de/forum/viewtopic-var-t-is-39467.html
(ursprünglich war das Schlüsselwort "export" dafür vorgesehen, jedoch gibt es nur einen Compiler bisher der das unterstützt - und im neuen Standard C++0x hat man es wieder verworfen, da der Implementierungsaufwand dafür zu groß ist).