2009-06-01 8 views
1

Je dois pouvoir passer un typename comme paramètre:Comment prendre un nom de type comme paramètre dans une fonction? (C++)

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

Le concept est pour FileRead (std :: fstream, int pos, ???) pour lire pos * sizeof (quel que soit le type est) pour obtenir la position désirée. J'ai essayé des modèles:

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

, mais ce qui est nécessaire que je crée une variable du type à utiliser chaque fois que je voulais utiliser FileRead, et je ne me sens vraiment pas comme redessiner tout un programme juste parce que d'une fonction, Y a-t-il de toute façon à utiliser un nom de type comme paramètre?

Répondre

12

Pour utiliser le nom d'un type en tant que paramètre, utilisez un modèle.

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

Ceci suppose que le type est constructible par défaut. Si ce n'est pas le cas, je suppose que vous auriez de la difficulté à le faire sortir d'un fichier de toute façon.

Appelez comme ceci:

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

Si vous ne voulez pas avoir à spécifier le type dans l'appel, vous pouvez modifier votre API:

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

appellent Alors comme ça - le type est déduit:

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

Ensuite, je reçois l'erreur "Impossible de déduire l'argument pour 'T'" –

+0

Je pense que vous auriez besoin de T comme un argument plutôt que comme la valeur de retour. –

+2

Appelez-le comme FileRead (fichier, pos); – sth

-2

Il n'y a rien de tel que les types une fois que votre programme est compilé. C'est le style de C++.

+1

Si cela était vrai RTTI n'existerait pas. – CoffeeandCode

3

Très simple:

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

et l'appeler via:

char x = FileRead<char>(file, pos); 
Questions connexes