2009-06-01 4 views
1

Ich brauche einen Typnamen als Parameter übergeben können:Wie nehme ich einen Typnamen als Parameter in einer Funktion? (C++)

int X = FileRead(file, 9, char); 

Das Konzept ist für Fileread (std :: fstream, int pos, ???) pos * sizeof zu lesen (was auch immer der Typ ist), um die gewünschte Position zu erhalten. Ich habe versucht, Vorlagen:

template<typename T> 
T FileRead(std::fstream file, int pos, T type) 
{ 
    T data; 
    file.read(reinterpret_cast<char*>(&data), sizeof(data)); 
    return data; 
} 

aber erforderlich, dass ich eine Variable vom Typ erstelle jedes Mal zu verwenden, wollte ich Fileread verwenden, und ich fühle mich wirklich nicht, wie ein ganzes Programm neu zu gestalten, nur weil eine Funktion, Gibt es einen Typnamen als Parameter?

Antwort

12

Verwenden Sie eine Vorlage, um den Namen eines Typs als Parameter zu verwenden.

template<typename T> 
T FileRead(std::fstream &file, int pos) 
{ 
    T data; 
    file.read(reinterpret_cast<char*>(&data), sizeof(T)); 
    return data; 
} 

Dies setzt voraus, dass der Typ standardmäßig konstruierbar ist. Wenn nicht, hätten Sie wahrscheinlich Schwierigkeiten, es aus einer Datei zu streamen.

Nennen Sie es wie folgt aus:

char value=FileRead<char>(file, pos); 

Wenn Sie den Typ in dem Aufruf nicht angeben haben möchten, können Sie Ihre API ändern könnte:

template<typename T> 
void FileRead(std::fstream &file, int pos, T &data) 
{ 
    file.read(reinterpret_cast<char*>(&data), sizeof(T)); 
} 

Dann rufen Sie es wie folgt - der Typ wird gefolgert:

char value; 
FileRead(file, pos, value); 
+0

Dann bekomme ich den Fehler "konnte Argument für 'T' nicht ableiten" –

+0

Ich denke, dass Sie T als Argument und nicht nur als Rückgabewert benötigen. –

+2

Rufen Sie es wie FileRead (Datei, pos); – sth

-2

Es gibt keine Dinge wie Typen, sobald Ihr Programm kompiliert ist. Dies ist der Stil von C++.

+1

Wenn das wahr wäre, würde RTTI nicht existieren. – CoffeeandCode

3

Ganz einfach:

template<typename T> 
T FileRead(std::fstream file, int pos) 
{ 
    T data; 
    file.read(reinterpret_cast<char*>(&data), sizeof(data)); 
    return data; 
} 

und nennen es über:

char x = FileRead<char>(file, pos); 
Verwandte Themen