Bonjour à tous !

J'ai créer une classe Camera, qui commence à devenir complexe.
Pour des besoins de physique pure, j'ai dû la recoder en template afin de prendre en compte différent type de pixel possible : float, double, unsigned char, etc...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
template <typename T>
class Camera
{
public:
	typedef typename T			value_type;
	typedef typename vigra::BasicImage<T>	image_type;
 
	Camera(Choc &c, std::string nom_camera);
	virtual ~Camera(void);
 
	image_type getImage(const float & temps_image); // Fonction principale : appel standard
	image_type getImage(const int & numero_image); 
 
        void genererFilm(int image_debut, int image_fin, std::string nom_fichier, boost::function<void (image_type & )> fonct);
	void genererFilm(float temps_debut, float temps_fin, std::string nom_fichier, boost::function<void (image_type & )> fonct);
 
private:
     // du code....
 
};
Dans la fonction genererFilm(), je génère un fichier binaire (car plus rapide) comprenant toutes les images de mon film mis bout à bout, ainsi qu'un petit fichier à côté comprenant les données du film : nombre d'images, hauteur et largeur du film...

Le problème est le suivant : Maintenant que je suis en template, comment écrire dans ce petit fichier la donnée T modèle, afin de pouvoir relire ensuite la fichier en mode binaire correctement...
Comment distinguer float et double?
Comment distinguer double et long int ?
J'avais pensé à écrire en chaine de caractère le nom, mais c'est pas très portable...

Pour info, mon ancienne fonction de lecture (unsigned short) est la suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
 
void Camera_Virtuelle::importImage(int numero_image)
{
	std::ifstream fichier(m_nom_film.c_str(), std::ios_base::in | std::ios_base::binary);
 
	std::vector<unsigned short> vect(m_taille_image);
	fichier.seekg(numero_image * m_taille_image * sizeof(unsigned short), std::ios_base::beg);
	fichier.read(reinterpret_cast<char*>(&vect[0]), m_taille_image * sizeof(unsigned short));
 
	m_image = vigra::UInt16Image(m_image_width, m_image_height ,&vect[0]);
}
qui marche très bien tant qu'on connait le format...

Si vous pensez à une astuce propre, je vous en serais très reconnaissant !