Testez le typename avec une classe utilisant les templates

Résolu
amorosalain Messages postés 52 Date d'inscription jeudi 1 janvier 2004 Statut Membre Dernière intervention 22 juillet 2008 - 28 juil. 2006 à 15:57
amorosalain Messages postés 52 Date d'inscription jeudi 1 janvier 2004 Statut Membre Dernière intervention 22 juillet 2008 - 29 juil. 2006 à 09:32
[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

amorosalain Messages postés 52 Date d'inscription jeudi 1 janvier 2004 Statut Membre Dernière intervention 22 juillet 2008
28 juil. 2006 à 16:29
[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 ++
3
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
28 juil. 2006 à 16:38
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
0
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
28 juil. 2006 à 19:10
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);
0
amorosalain Messages postés 52 Date d'inscription jeudi 1 janvier 2004 Statut Membre Dernière intervention 22 juillet 2008
29 juil. 2006 à 09:16
[size= 6] SAM =6
effectivement, c'est encore mieux.

merci.

++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
amorosalain Messages postés 52 Date d'inscription jeudi 1 janvier 2004 Statut Membre Dernière intervention 22 juillet 2008
29 juil. 2006 à 09:32
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.

++
0
Rejoignez-nous