Testez le typename avec une classe utilisant les templates [Résolu]

Signaler
Messages postés
52
Date d'inscription
jeudi 1 janvier 2004
Statut
Membre
Dernière intervention
22 juillet 2008
-
Messages postés
52
Date d'inscription
jeudi 1 janvier 2004
Statut
Membre
Dernière intervention
22 juillet 2008
-
[size= 6] SAM =6
Bonjour à tous.

J'ai besoin d'un peu d'aide.

J'ai une classe ou j'utilise un template.

template<typename T>
maclasse<T>::mamethode(...)
{
}

dans cette méthode, je voudrais tester si T est un int, un short ... afin d'affecter une valeur dans le but d'écrire un format de fichier

ex :
si (T est un int) alors mastruct->type = I_INTEGER;

Est-ce possible et si oui comment faire ?

A noter que je pourrais tester la taille avec sizeof(T) mais alors, je ne pourrais pas faire la différence entre un short et un unsigned short.

Avec un grand merci.

++

5 réponses

Messages postés
52
Date d'inscription
jeudi 1 janvier 2004
Statut
Membre
Dernière intervention
22 juillet 2008

[size= 6] SAM =6
Salut.

Je réponds tout seul à ma question car j'ai eu la réponse.

En faites, dans le .h, on déclare des méthodes surchargées.
long GetTypeId(char value);
long GetTypeId(unsigned char value);
...

dans le .cpp

template<typename T>
long maclasse<T>::GetTypeId(char value)
{
   return I_CHAR;
}

template<typename T>
long maclasse<T>::GetTypeId(unsigned char value)
{
   return I_UCHAR;
}
etc...

et dans la fonction qui a besoin du type

T value = 0;
mastruct->type = GetTypeId(value);

c'était très simple mais il fallait y penser et je devais être beaucoup fatigué.

bon code ++
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Ah tu as trouvé... Pendant ce temps j'étais parti sur une autre piste,
avec les typeid (je pense que ta solution est meilleure, j'y avais pas
pensé non plus).


#include

#include <typeinfo>


using namespace std;


template <typename T>

void f(T x)

{

  if(typeid(x) == typeid(short)) cout << "short" << endl;

  else if(typeid(x) == typeid(unsigned short)) cout << "unsigned short" << endl;

}


int main()

{

  short x = 1;

  unsigned short y = 2;

  f(x);

  f(y);

}

_____________________________________
Un éditeur de ressources gratuit pour Windows
Messages postés
475
Date d'inscription
dimanche 3 octobre 2004
Statut
Membre
Dernière intervention
11 août 2006
3
Oui la solution de [auteurdetail.aspx?ID=212337 amorosalain] est trés bien, avec typeid c'est moins efficace car on perd l'avantage du fait que tout ca peut être résolu statiquement.


Mais pour éviter d'avoir un appel de ce type
T value = 0;

mastruct->type = GetTypeId(value);


j'aurais fait
template<typename T>

void maclasse<T>::SetValue(unsigned char & value)

{

   value = I_UCHAR;

}


SetValue(mastruct->type);
Messages postés
52
Date d'inscription
jeudi 1 janvier 2004
Statut
Membre
Dernière intervention
22 juillet 2008

[size= 6] SAM =6
effectivement, c'est encore mieux.

merci.

++
Messages postés
52
Date d'inscription
jeudi 1 janvier 2004
Statut
Membre
Dernière intervention
22 juillet 2008

SAM

Non finallement, il y aura un soucis.
mastruct->type est toujours de type long.
C'est un long enregistré dans le header et qui indique le type des valeurs qui vont suivre dans le fichier.

car value, on s'en fiche, on veut juste tester son type et enregistrer le résultat dans un long.

++